跳转至

表单数据 Form data

Django Ninja 还允许你解析和验证 request.POST 数据 (也就是 application/x-www-form-urlencodedmultipart/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}

将空表单字段映射到默认值

可选的表单字段经常以空值发送。这个值被解释为空字符串,因此对于诸如 intbool 等字段可能无法通过验证。

如 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()

大功告成

继续下一章节! 文件上传

评论


本文总阅读量