表单数据 Form data
Django Ninja 还允许你解析和验证 request.POST
数据
(也就是 application/x-www-form-urlencoded
或 multipart/form-data
).
作为参数的表单数据
from ninja import NinjaAPI, Form
@api.post("/login")
def login(request, username: Form[str], password: Form[str]):
return {'username': username, 'password': '*****'}
请注意以下几点:
1) 你需要从 ninja
导入 Form
类
from ninja import Form
2) 使用 Form
作为参数的默认值:
username: Form[str]
使用模式
与 请求体 Body类似, 你可以使用模式来组织你的参数。
from ninja import Form, Schema
class Item(Schema):
name: str
description: str = None
price: float
quantity: int
@api.post("/items")
def create(request, item: Form[Item]):
return item
请求表单 + 路径 + 查询参数
与 请求体 Body类似, 你可以结合其他参数来源使用表单数据。
你可以 同时 声明查询参数 和 路径 和 表单字段, 等等 ... 参数。
Django Ninja 将识别出与路径参数匹配的函数参数应 从路径中获取,
而声明为Form(...)
的函数参数应 从请求表单字段中获取 等等。
from ninja import Form, Schema
class Item(Schema):
name: str
description: str = None
price: float
quantity: int
@api.post("/items/{item_id}")
def update(request, item_id: int, q: str, item: Form[Item]):
return {"item_id": item_id, "item": item.dict(), "q": q}
将空表单字段映射到默认值
可选的表单字段经常以空值发送。这个值被解释为空字符串,因此对于诸如 int
或 bool
等字段可能无法通过验证。
如 Pydantic 文档所述,可以通过使用作为类型的泛型类 来解决这个问题。
from ninja import Form, Schema
from typing import Annotated, TypeVar
from pydantic import WrapValidator
from pydantic_core import PydanticUseDefault
def _empty_str_to_default(v, handler, info):
if isinstance(v, str) and v == '':
raise PydanticUseDefault
return handler(v)
T = TypeVar('T')
EmptyStrToDefault = Annotated[T, WrapValidator(_empty_str_to_default)]
class Item(Schema):
name: str
description: str = None
price: EmptyStrToDefault[float] = 0.0
quantity: EmptyStrToDefault[int] = 0
in_stock: EmptyStrToDefault[bool] = True
@api.post("/items-blank-default")
def update(request, item: Form[Item]):
return item.dict()
大功告成
继续下一章节! 文件上传
评论
本文总阅读量次