路径操作配置

路径操作装饰器支持多种配置参数。

警告

注意:以下参数应直接传递给路径操作装饰器,不能传递给路径操作函数

status_code 状态码

status_code 用于定义路径操作响应中的 HTTP 状态码。

可以直接传递 int 代码, 比如 404

如果记不住数字码的涵义,也可以用 status 的快捷常量:

  1. from typing import Set, Union
  2. from fastapi import FastAPI, status
  3. from pydantic import BaseModel
  4. app = FastAPI()
  5. class Item(BaseModel):
  6. name: str
  7. description: Union[str, None] = None
  8. price: float
  9. tax: Union[float, None] = None
  10. tags: Set[str] = set()
  11. @app.post("/items/", response_model=Item, status_code=status.HTTP_201_CREATED)
  12. async def create_item(item: Item):
  13. return item

状态码在响应中使用,并会被添加到 OpenAPI 概图。

技术细节

也可以使用 from starlette import status 导入状态码。

FastAPIfastapi.statusstarlette.status 一样,只是快捷方式。实际上,fastapi.status 直接继承自 Starlette。

tags 参数

tags 参数的值是由 str 组成的 list (一般只有一个 str ),tags 用于为路径操作添加标签:

  1. from typing import Set, Union
  2. from fastapi import FastAPI
  3. from pydantic import BaseModel
  4. app = FastAPI()
  5. class Item(BaseModel):
  6. name: str
  7. description: Union[str, None] = None
  8. price: float
  9. tax: Union[float, None] = None
  10. tags: Set[str] = set()
  11. @app.post("/items/", response_model=Item, tags=["items"])
  12. async def create_item(item: Item):
  13. return item
  14. @app.get("/items/", tags=["items"])
  15. async def read_items():
  16. return [{"name": "Foo", "price": 42}]
  17. @app.get("/users/", tags=["users"])
  18. async def read_users():
  19. return [{"username": "johndoe"}]

OpenAPI 概图会自动添加标签,供 API 文档接口使用:

路径操作配置 - 图1

summarydescription 参数

路径装饰器还支持 summarydescription 这两个参数:

  1. from typing import Set, Union
  2. from fastapi import FastAPI
  3. from pydantic import BaseModel
  4. app = FastAPI()
  5. class Item(BaseModel):
  6. name: str
  7. description: Union[str, None] = None
  8. price: float
  9. tax: Union[float, None] = None
  10. tags: Set[str] = set()
  11. @app.post(
  12. "/items/",
  13. response_model=Item,
  14. summary="Create an item",
  15. description="Create an item with all the information, name, description, price, tax and a set of unique tags",
  16. )
  17. async def create_item(item: Item):
  18. return item

文档字符串(docstring

描述内容比较长且占用多行时,可以在函数的 docstring 中声明路径操作的描述,FastAPI 支持从文档字符串中读取描述内容。

文档字符串支持 Markdown,能正确解析和显示 Markdown 的内容,但要注意文档字符串的缩进。

  1. from typing import Set, Union
  2. from fastapi import FastAPI
  3. from pydantic import BaseModel
  4. app = FastAPI()
  5. class Item(BaseModel):
  6. name: str
  7. description: Union[str, None] = None
  8. price: float
  9. tax: Union[float, None] = None
  10. tags: Set[str] = set()
  11. @app.post("/items/", response_model=Item, summary="Create an item")
  12. async def create_item(item: Item):
  13. """
  14. Create an item with all the information:
  15. - **name**: each item must have a name
  16. - **description**: a long description
  17. - **price**: required
  18. - **tax**: if the item doesn't have tax, you can omit this
  19. - **tags**: a set of unique tag strings for this item
  20. """
  21. return item

下图为 Markdown 文本在 API 文档中的显示效果:

路径操作配置 - 图2

响应描述

response_description 参数用于定义响应的描述说明:

  1. from typing import Set, Union
  2. from fastapi import FastAPI
  3. from pydantic import BaseModel
  4. app = FastAPI()
  5. class Item(BaseModel):
  6. name: str
  7. description: Union[str, None] = None
  8. price: float
  9. tax: Union[float, None] = None
  10. tags: Set[str] = set()
  11. @app.post(
  12. "/items/",
  13. response_model=Item,
  14. summary="Create an item",
  15. response_description="The created item",
  16. )
  17. async def create_item(item: Item):
  18. """
  19. Create an item with all the information:
  20. - **name**: each item must have a name
  21. - **description**: a long description
  22. - **price**: required
  23. - **tax**: if the item doesn't have tax, you can omit this
  24. - **tags**: a set of unique tag strings for this item
  25. """
  26. return item

说明

注意,response_description 只用于描述响应,description 一般则用于描述路径操作

检查

OpenAPI 规定每个路径操作都要有响应描述。

如果没有定义响应描述,FastAPI 则自动生成内容为 “Successful response” 的响应描述。

路径操作配置 - 图3

弃用路径操作

deprecated 参数可以把路径操作标记为弃用,无需直接删除:

  1. from fastapi import FastAPI
  2. app = FastAPI()
  3. @app.get("/items/", tags=["items"])
  4. async def read_items():
  5. return [{"name": "Foo", "price": 42}]
  6. @app.get("/users/", tags=["users"])
  7. async def read_users():
  8. return [{"username": "johndoe"}]
  9. @app.get("/elements/", tags=["items"], deprecated=True)
  10. async def read_elements():
  11. return [{"item_id": "Foo"}]

API 文档会把该路径操作标记为弃用:

路径操作配置 - 图4

下图显示了正常路径操作与弃用路径操作 的区别:

路径操作配置 - 图5

小结

通过传递参数给路径操作装饰器 ,即可轻松地配置路径操作、添加元数据。