# PYTHON 調整相關
[TOC]
---
### 1. 當 @parse_params(form=XXX) 是 form時, Body有兩種寫法, 改如何判斷?:
Ans: 檢查裡面有沒有用到 **FileStorage**,如果有就用第二種,沒有就用第一種。 目前我有把 FileStorage 給註解。
> 第一種:
```python
@openapi.body(multipart_form_model(LiveInferAD))
```
>第二種:
```python
# 例如: api/handler_ad.py 第189行
@parse_params(form=InferAD) ## ---> 是使用 form,點 InferAD
# 會看到InferAD結構
class InferAD(UploadFiles, UniqueName): # 點 UploadFiles 跟 UniqueName
threshold: float = Field(description="閾值", example=1.93)
# 會看到UploadFiles結構
class UploadFiles(BaseModel):
folder_path: str = Field(description="資料夾路徑", default="")
# image: Optional[List[FileStorage]] # --> 有用到 FileStorage
# 會看到UniqueName結構
class UniqueName(BaseModel):
name: str = Field(description="唯一名稱", default="", example="default")
###### 總結
# FileStorage 使用 schema_single_file()
# List[FileStorage] 使用 schema_multiple_file()
```
```python
@openapi.body(
multipart_form(
{
"name": Schema(
type="string",
default="",
example="default",
description="唯一名稱",
),
"threshold": Schema(
type="number",
default=0.7,
example=0.7,
description="信心度閾值[0 ~ 1]",
),
"folder_path": Schema(type="string", default="", description="資料夾路徑"),
"image": schema_multiple_file(),
},
required=["threshold"],
)
)
)
```
---
### 2. 原本在 app.get 內沒有 response 是否 openapi 這邊就不需要?
- 但在 mjpeg_infer_seg 的函數內容有 return

程式碼:
```python
@app.get(
"/api/infer_seg/live",
tags=[seg_tag],
)
@openapi.summary("取得異常偵測模型初始閾值")
@openapi.tag(seg_tag)
@openapi.parameter("name", Schema(default=""), "query", description="唯一名稱")
@openapi.response(200, application_json(API_Response_Scheme(InitADResponse)))
@parse_params(query=UniqueName)
async def mjpeg_infer_seg(request: Request, params: UniqueName):
return Response(
gather_live_inference_seg(params.name),
mimetype="multipart/x-mixed-replace; boundary=frame",
)
```
Response() 是要改用 HTTPResponse() 嗎 ?
Ans: 參照 api/handler_ad.py 第396行
```python
@openapi.response(200, {"multipart/x-mixed-replace": "即時結果影像"})
@parse_params(query=UniqueName)
async def mjpeg_infer_ad(request: Request, params: UniqueName):
name = params.name
response: HTTPResponse = await request.respond(
content_type="multipart/x-mixed-replace; boundary=frame"
) # type: ignore
if response is None:
return
# ... 以下省略 ...
```
有使用到**sleep**的話,最上方的 import 要記得改
```python
# 原本
from time import sleep
# 改成
from asyncio import sleep
```
---
/api/infer_seg/live_result
### 3. 新/舊回傳結果不同
舊:

新:

---
### 修改問題重點


- from werkzeug.datastructures import FileStorage
- 把有用到 FileStorage 的都改成File
- 1:

- 2:

- 3:
