路径参数
您可以使用与 Python 格式化字符串相同的语法 (幸运的是,这也与 OpenAPI 路径参数匹配)来声明路径“参数”:
@api.get("/items/{item_id}")
def read_item(request, item_id):
return {"item_id": item_id}
路径参数 item_id
的值将作为参数 item_id
传递给您的函数。
因此,如果您运行此示例并转到 http://localhost:8000/api/items/foo, 您将看到此响应:
{"item_id":"foo"}
带类型的路径参数
您可以在函数中使用标准 Python 类型注解来声明路径参数的类型:
@api.get("/items/{item_id}")
def read_item(request, item_id: int):
return {"item_id": item_id}
在这种情况下,item_id
被声明为一个 int
。这将为您提供编辑器和代码检查器对错误检查、代码补全等的支持。
如果您在浏览器中使用 http://localhost:8000/api/items/3运行此代码,您将看到此响应:
{"item_id":3}
提示
请注意,您的函数接收(并返回)的值是 3, 作为 Python 的 int
- 而不是字符串 "3"
.
因此,仅通过该类型声明,Django Ninja 就为您提供了自动请求“解析”和验证。
数据验证
另一方面,如果您在浏览器中访问 http://localhost:8000/api/items/foo ("foo"
不是int),您将看到如下 HTTP 错误:
{
"detail": [
{
"loc": [
"path",
"item_id"
],
"msg": "value is not a valid integer",
"type": "type_error.integer"
}
]
}
Django 路径转换器
您可以使用 Django 路径转换器 来帮助解析路径:
@api.get("/items/{int:item_id}")
def read_item(request, item_id):
return {"item_id": item_id}
在这种情况下,item_id
将被解析为一个 int
。如果 item_id
不是有效的 int
则该 URL 将不匹配。
(例如,如果没有其他路径匹配,则会返回一个404 未找到)
提示
请注意,由于 Django Ninja 对未注释的参数使用默认的 str
类型, 上述函数接收(和返回)的值是 "3"
,
作为一个 Python str
- 而不是整数 3。 要接收一个 int
,只需像平常一样在函数定义中简单地将 item_id
声明为 int
类型注释:
@api.get("/items/{int:item_id}")
def read_item(request, item_id:int):
return {"item_id": item_id}
带斜线的路径参数
Django 的 path
转换器允许你处理类似路径的参数:
@api.get('/dir/{path:value}')
def someview(request, value: str):
return value
/dir/some/path/with-slashes
来查询此操作,并且你的 value
将等于 some/path/with-slashes
多个参数
你可以向 path
传递任意多的变量只要记住要有唯一的名称,并且不要忘记在函数参数中使用相同的名称。
@api.get("/events/{year}/{month}/{day}")
def events(request, year: int, month: int, day: int):
return {"date": [year, month, day]}
使用 Schema 模式
你也可以使用 Schema 模式来封装相互依赖的路径参数(并作为一个组进行验证):
import datetime
from ninja import Schema, Path
class PathDate(Schema):
year: int
month: int
day: int
def value(self):
return datetime.date(self.year, self.month, self.day)
@api.get("/events/{year}/{month}/{day}")
def events(request, date: Path[PathDate]):
return {"date": date.value()}
注意
请注意,这里我们使用了一个 Path
源提示,让 Django Ninja 知道这个模式将应用于路径参数。
文档
现在,当你在浏览器中打开 http://localhost:8000/api/docs 时,你将看到自动的、交互式的 API 文档。
大功告成
继续下一章节! 查询参数
评论
本文总阅读量次