表單
如果要獲取表單的數(shù)據(jù),需要進(jìn)行一下步驟:
- 導(dǎo)入 fastapi 中的 Form
- 在模板中通過 Form(...) 來獲取參數(shù)的值
假設(shè)我們做了一個(gè)登錄頁面癞松,有兩個(gè)field,一個(gè)叫做 username 茅姜,一個(gè)叫做 password予弧,那么獲取參數(shù)的方式如下:
from starlette.requests import Request
from fastapi import FastAPI, Form
from starlette.templating import Jinja2Templates
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.post("/user/")
async def form_text(request: Request, username: str = Form(...), password: str = Form(...)):
print('username', username)
print('password', password)
return templates.TemplateResponse('index.html', {'request': request, 'username': username, 'password': password})
其中(...)表示這是必須的參數(shù)。
上傳文件
上傳文件時(shí)移必,表單的 method 必須是 "post" ,enctype 要是 "multipart/form-data" 毡鉴。同時(shí)崔泵,還必須安裝 python-multipart 包,否則會(huì)報(bào) 400 bad request 錯(cuò)誤猪瞬。
from starlette.requests import Request
from fastapi import FastAPI, File, UploadFile
from starlette.templating import Jinja2Templates
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.post('/single_file')
async def single_file(request: Request,
file: UploadFile = File(...)):
res = await file.read()
with open(file.filename, "wb") as f:
f.write(res)
return {"message": "success", 'filename': file.filename}
@app.get('/')
async def upload(request: Request):
return templates.TemplateResponse('index.html', {"request": request})
請(qǐng)求體(Request Body)
Request body 即通過 post 請(qǐng)求的請(qǐng)求體傳來的數(shù)據(jù)憎瘸,而不是明文寫入 url 鏈接的參數(shù)。請(qǐng)求體的數(shù)據(jù)通常是通過 JSON 傳入的陈瘦,例如:
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
item_dict = item.dict()
if item.tax:
price_with_tax = item.price + item.tax
item_dict.update({"price_with_tax": price_with_tax})
return item_dict
我們可以利用 http://localhost:8000/docs 文檔功能傳入 JSON 數(shù)據(jù)進(jìn)行測試幌甘,也可以使用 curl 命令進(jìn)行測試。請(qǐng)求體可以和路徑參數(shù)及查詢參數(shù)合并使用痊项。