ปกติถ้าหากจำนวน Fields ใน Form มีไม่มากก็ไม่มีปัญหาเราสามารถเขียนแบบปกติได้ เช่น
@app.post("/abc",response_model=bool)defabc(id:int=Form(...),name:str=Form(default=None),status:str=Form(default="single")):returnTrue
แต่ถ้า Fields มีเยอะ ๆ สัก 10 Fields ขึ้นไป Code ก็จะเริ่มดูยากยาวมาก การใช้ Pydantic model เข้ามาช่วยก็จะจัดการง่ายขึ้น ปกติเราใช้ Pydantic model ใน Body แบบ JSON กันอยู่แล้วแต่สำหรับ Form Data จะมีลูกเล่นนิดหนึ่ง ค้นหาใน internet ไปเจอวิธีที่คิดว่าง่ายที่สุดละเลยบันทึกไว้สักหน่อย
ต้นฉบับที่ผมนำมาใช้
ตัวอย่าง model.py
fromtypingimportOptionalfromfastapiimportFormfrompydanticimportBaseModeldefform_body(cls):cls.__signature__=cls.__signature__.replace(parameters=[arg.replace(default=Form(default=arg.default)ifarg.defaultisnotinspect._emptyelseForm(...))forargincls.__signature__.parameters.values()])returncls@form_bodyclassProfile(BaseModel):passport_no:Optional[str]hn:Optional[str]patient_guid:Optional[str]prefix:str="นาย"first_name:strlast_name:strprefix_eng:str="Mr"first_name_eng:Optional[str]middle_name_eng:Optional[str]last_name_eng:Optional[str]gender:int=1birth_date:Optional[str]mobile_phone:Optional[str]installed_line_connect:Optional[str]address:Optional[str]moo:Optional[str]road:Optional[str]chw_code:Optional[str]amp_code:Optional[str]tmb_code:Optional[str]address_full_thai:Optional[str]address_full_english:Optional[str]nationality:Optional[str]
ในส่วนของ Form มันจะมีหลัก ๆ อยู่สามแบบคือ
- บังคับ
- มีค่า Default
- มีก็ได้ไม่มีก็ได้
ผมเลยปรับในตัว Decorators เพิ่มเติมให้มันปรับตาม Model ที่เรากำหนดไว้
arg.replace(default=Form(default=arg.default)ifarg.defaultisnotinspect._emptyelseForm(...))
ตัวอย่าง Router
frommodelimportProfilefromfastapiimportDepends,FastAPI,File,UploadFileapp=FastAPI()@app.post("/abc",response_model=bool)defabc(profile:Profile=Depends(Profile),photo:UploadFile=File(...)):returnTrue
ตอน Render ก็จะได้ประมาณนี้
ลองเอาไปประยุกต์ใช้กันดูครับ
Top comments(4)

- LocationSE Asia
- Worksoftware engineer
- Joined
คือเอาไว้ทำอะไรนะครับ ?

- LocationSE Asia
- Worksoftware engineer
- Joined
Python นี่รับ request เข้ามาตัวแปรเดียวไม่ได้ใช่เปล่าครับ เลยต้องทำแบบนี้ ?
For further actions, you may consider blocking this person and/orreporting abuse