# 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 ![](https://hackmd.io/_uploads/B1uBOYB8h.png) 程式碼: ```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. 新/舊回傳結果不同 舊: ![](https://hackmd.io/_uploads/r1HpXaSI2.png) 新: ![](https://hackmd.io/_uploads/Bk1xETHL3.png) --- ### 修改問題重點 ![](https://hackmd.io/_uploads/SJBMh9rL3.png) ![](https://hackmd.io/_uploads/SJEQh9SL3.png) - from werkzeug.datastructures import FileStorage - 把有用到 FileStorage 的都改成File - 1: ![](https://hackmd.io/_uploads/Hkqv6cBL3.png) - 2: ![](https://hackmd.io/_uploads/SJ3YT9r82.png) - 3: ![](https://hackmd.io/_uploads/By49pqrIh.png)