跳转至

教程 - 解析传入的参数

来自查询字符串的传参

让我们将操作修改为从 URL 的查询字符串中接受一个名称。为此,只需在我们的函数中添加一个 name 参数。

@api.get("/hello")
def hello(request, name):
    return f"Hello {name}"

当我们提供命名参数时,我们会得到预期的 (HTTP 200) 响应。

localhost:8000/api/hello?name=you:

"Hello you"

默认值

如果不提供该参数,将返回 HTTP 422 错误响应。

localhost:8000/api/hello:

{
  "detail": [
    {
      "loc": ["query", "name"],
      "msg": "field required",
      "type": "value_error.missing"
    }
  ]
}

我们可以为 name 参数指定一个默认值,以防没有提供:

@api.get("/hello")
def hello(request, name="world"):
    return f"Hello {name}"

输入类型

Django Ninja 使用标准的 Python type hints 来格式化输入类型。如果没有提供类型,则假定为字符串 (但为所有参数提供类型提示是最佳实践)。

让我们添加第二个操作,用整数进行一些基本的数学运算。

@api.get("/hello")
def hello(request, name: str = "world"):
    return f"Hello {name}"

@api.get("/math")
def math(request, a: int, b: int):
    return {"add": a + b, "multiply": a * b}

localhost:8000/api/math?a=2&b=3:

{
  "add": 5,
  "multiply": 6
}

通过路径字符串传参

你可以使用与 Python 格式化字符串相同的语法来声明路径“参数”。

在路径字符串中找到的任何参数将作为参数传递给你的函数,而不是从查询字符串中获得它们。

@api.get("/math/{a}and{b}")
def math(request, a: int, b: int):
    return {"add": a + b, "multiply": a * b}

现在我们通过 localhost:8000/api/math/2and3 来访问数学操作。

通过请求体传参

我们将把 hello 操作改为使用 HTTP POST 请求, 并从请求体中获取参数。

为了指定参数来自请求体,我们需要声明一个模式。

from ninja import NinjaAPI, Schema

api = NinjaAPI()

class HelloSchema(Schema):
    name: str = "world"

@api.post("/hello")
def hello(request, data: HelloSchema):
    return f"Hello {data.name}"

自文档化的 API

现在访问 localhost:8000/api/hello 会导致 HTTP 405 错误响应,因为我们需要将向此 URL 发起的请求改为 POST 类型。

一种简单的方法是使用自动为我们创建的 Swagger 文档,在默认的“/docs”URL(附加到我们的 API 网址根)。

  1. 访问 localhost:8000/api/docs 查看我们创建的操作
  2. 打开 /api/hello 操作
  3. 点击 "Try it out"
  4. 更改请求体
  5. 点击 "Execute"

大功告成

继续下一章节 处理响应

评论


本文总阅读量