fastapi-路由

news2025/1/21 5:46:27

FastAPIAPIRouter是一个用于将不同功能模块的端点进行划分的工具,类似于Flask中的蓝图(Blueprint)。通过APIRouter,你可以将应用程序的不同部分组织成独立的路由模块,从而提高代码的可读性和可维护性。

APIRouter允许你在不同的模块中定义路由操作,然后将它们挂载到全局应用程序路由中。这样,你可以将相关的路由操作组织在一起,使代码结构更加清晰,同时便于管理和维护

APIRouter使用

假设你在routers/router_1.py文件下,定义了以下这么一个非常简单的APIRouter

from fastapi import APIRouter

router = APIRouter()

@router.get("/get")
async def get():
    return {'api': 'get'}
    
@router.post("/post")
async def post():
    return {'api': 'post'}
    
@router.put("/put")
async def put():
    return {'api': 'put'}
    
@router.patch("/patch")
async def patch():
    return {'api': 'patch'}
    
@router.delete("/delete")
async def delete():
    return {'api': 'delete'}

定义好APIRouter之后,需要在应用程序中将其添加进来,如下:

from fastapi import FastAPI
from routers.router_1 import router

app = FastAPI()
app.include_router(router)

当我们添加一组路由时,我们需要给这些路由加一个前缀,表示这是同一批路由。我们可以用到prefix参数,如下:

from fastapi import APIRouter

router = APIRouter(prefix="/apis")

@router.get("/get")
async def get():
    return {'api': 'get'}

如此,我们可以通过http://localhost:8000/apis/get来请求该路由。

参数介绍

APIRouter常见参数如下:

prefix

prefix为API前缀,接收一个str数据

tags

tags为路由设置标签,接收一个List[str]或者List[Enum]类型

router = APIRouter(tags=["home", "user"])

@router.get("/home")
async def home():
    return {"code": 1}

在Swagger UI中效果如下:

piAMOfS.png

dependencies

dependencies为依赖项,可用来做一些额外操作(例如权限验证等),接收一个Sequence[params.Depends]类型。如下:

from fastapi import Header
from fastapi import Depends
from fastapi import APIRouter

async def token_validation(authorization: str = Header(...)):
    print(authorization)

router = APIRouter(dependencies=[Depends(token_validation)])

@router.get("/home")
async def home():
    return {"code": 1}

当我们请求/home这个路由时,如果没有携带Authorization标头,将会抛出422错误,如下:

{
    "detail": [
        {
            "loc": [
                "header",
                "authorization"
            ],
            "msg": "field required",
            "type": "value_error.missing"
        }
    ]
}
default_response_class

default_response_class为默认响应类,接收一个Response类型,默认是JSONResponse。所以当我们视图函数中只需要返回json所支持的类型数据即可,它会包装成JSON响应给到客户端

responses

responses为响应状态示例,接收一个dict类型。如下:

router = APIRouter(responses={404: {"description": "Resource Not Found",
                                    "content": {
                                        "application/json": {
                                            "schema": {
                                                "type": "object",
                                                "properties": {
                                                    "code": {
                                                        "type": "integer",
                                                        "format": "int32"
                                                    }
                                                }
                                            }
                                        }
                                    }}
                              })
@router.get("/home")
async def home():
    return {"code": 1}

在Swagger UI中效果如下:

piAMJZq.png

上面代码也可以修改成这样:

from fastapi import APIRouter
from pydantic import BaseModel

class NotFoundModel(BaseModel):
    code: int

router = APIRouter(responses={404: {"description": "Resource Not Found",
                                    "model": NotFoundModel}
                              })
@router.get("/home")
async def home():
    return {"code": 1}                 

另外,你也可以修改它默认的200响应示例(但并不推荐这么做)。状态码与对应的字典中支持的字段与格式,可以参考Swagger Editor中responses部分

callbacks

callbacks为回调函数列表,接收List[BaseRoute]类型,在APIRouter中设置似乎不起作用!

routes

routes为路由列表,接收List[routing.BaseRoute]类型

from fastapi import APIRouter
from fastapi.routing import APIRoute

async def home():
    return {"code": 1}

route = APIRoute("/home", endpoint=home, methods=['GET'])
router = APIRouter(routes=[route])
redirect_slashes

redirect_slashes用于是否检测和重定向url中的斜杠,默认为True。当设置为True时,如果路由为/home,当我们请求/home/时将会返回307状态码,并重定向至/home。同样,如果路由为/home/,而请求/home同样会进行重定向!但是如果设置为False时,将会引发404错误!!值得注意的是,APIRouter中设置不起效果,主要是根据FastAPI初始化的redirect_slashes值来判断

default

default用于处理404未找到错误的默认处理函数,为一个Callable对象,在APIRouter中设置似乎不起作用!

dependency_overrides_provider

dependency_overrides_provider: 仅在FastAPI内部使用,用于处理依赖覆盖。接收任何格式的数据

route_class

route_class为路由类,默认是APIRoute

on_startup

on_startup为启动事件处理程序函数列表,接收一个List[Callable]对象。推荐使用lifespan参数替代

on_shutdown

on_shutdown为关闭事件处理程序函数的列表,接收一个List[Callable]对象。推荐使用lifespan参数替代,使用如下:

async def orm_init():
    print('orm_init')

async def orm_close():
    print('orm_close')

router = APIRouter(on_startup=[orm_init], on_shutdown=[orm_close])

程序启动之后将会执行orm_init,而程序关闭之前将会执行orm_close!

lifespan

lifespan为生命周期上下文管理器处理程序。值得注意的是,APIRouter中设置不起效果,主要是根据FastAPI初始化的lifespan值来判断。使用如下:

from fastapi import FastAPI
from contextlib import asynccontextmanager

@asynccontextmanager
async def orm_helper(app: APIRouter):
    print('orm init')
    yield
    print('orm close')

app = FastAPI()
deprecated

deprecated用于表示是否过期,接收一个bool类型。使用如下:

from fastapi import APIRouter

router = APIRouter(prefix="/apis", tags=['home'], deprecated=True)

@router.get("/get")
async def get():
    return {'api': 'get'}

在Swagger UI中效果如下:

piAsuBq.png

include_in_schema

include_in_schema: 是否在Swagger UI中包含该路由,接收一个bool类型,默认为True

generate_unique_id_function

generate_unique_id_function: 生成唯一ID的方法,接收一个Callable对象

方法介绍

route()

route(path, methods, name, include_in_schema)视图方法,使用如下:

from fastapi import APIRouter
from fastapi.responses import JSONResponse

router = APIRouter(tags=['home'])

@router.route("/home", methods=['GET'])
async def home(request):
    return JSONResponse({"code": 1})

使用该方法的视图,不会在Swagger UI中显示!

add_api_route()

add_api_route(...)用于添加视图,相关参数介绍如下:

  • path: 路径,接收一个str类型
  • endpoint: 执行函数,接收一个Callable类型
  • response_model: 响应模型,接收任何类型数据
  • status_code: HTTP状态码,接收一个int类型
  • tags: 标签列表,接收一个List[str]或者List[Enum]类型。用法与APIRouter一样
  • dependencies: 为依赖项,可用来做一些额外操作(例如权限验证等)。用法与APIRouter一样
  • summary: 总结,接收一个str类型
  • description: 描述,接收一个str类型
  • response_description: 响应说明,接收一个str类型
  • responses: 响应状态示例,接收一个dict类型。用法与APIRouterresponses一样
  • deprecated: 用于表示是否过期,接收一个bool类型。用法与APIRouter一样
  • methods: 请求方法列表,接收一个Set[str]List[str]类型
  • operation_id: 唯一ID,接收一个str类型
  • response_model_include: 响应包含哪些字段,接收一个Set或者Dict
  • response_model_exclude: 响应不要包含哪些字段,接收一个Set或者Dict
  • response_model_by_alias: Response Model是否显示别名,接收一个bool类型True
  • response_model_exclude_unset: Response Model是否排除未设置的字段,默认为False
  • response_model_exclude_defaults: Response Model是否排除默认的字段,默认为False
  • response_model_exclude_none: Response Model是否排除为None的字段,默认为False
  • include_in_schema: 是否在Swagger UI中包含该视图,接收一个bool类型,默认为True。用法与APIRouter一样
  • response_class: 为默认响应类,接收一个Response类型,默认是JSONResponse
  • name: 为视图名称,接收一个str类型
  • route_class_override: 路由类,可以传递一个APIRoute类型,用于覆盖默认的APIRoute
  • callbacks: 回调函数列表,不起作用
  • openapi_extra: swagger ui中额外的参数
  • generate_unique_id_function: 生成唯一ID的方法,接收一个Callable对象。用法与APIRouter一样

add_api_route()使用如下:

from pydantic import Field
from pydantic import BaseModel

class ResponseModel(BaseModel):
    code: int = Field(title='状态码', description='状态码, 1:成功, 0:失败')
    msg: str = Field(title="描述", description='状态码对应描述')

async def create_user():
    resp = ResponseModel(code=1, msg='成功')
    return resp.model_dump()

router.add_api_route('/create', create_user,
                     response_model=ResponseModel,
                     status_code=2000,
                     tags=['user'],
                     summary='创建用户',
                     description='创建用户操作',
                     response_description='创建用户成功',
                     deprecated=True,
                     methods=['GET', 'POST'],
                     response_model_exclude={'msg'})
app.include_router(router)

在Swagger UI中效果如下:

pimG7PH.png

上图为演示效果,实际操作不建议设置为这样的值!!!

上面API,请求如下:

$ curl --location --request POST 'localhost:8000/create'
{"code":1}      # 因为msg被exclude了
api_route()

api_route()装饰器方法,其内部实现为调用了add_api_route()方法。所以add_api_route()所支持的参数,api_route()基本上都可以使用。如下:

@router.api_route("/create", response_model=ResponseModel, methods=['GET', 'POST'], summary='创建用户', description='创建用户操作')
async def create_user():
    resp = ResponseModel(code=1, msg='成功')
    return resp.model_dump()
get()、post()、put()、delete()、patch()、options()、trace()、head()

装饰器方法,其内部实现为调用了api_route()。所以add_api_route()所支持的参数,它们基本也都可以使用。使用如下:

@router.post("/create", response_model=ResponseModel, summary='创建用户', description='创建用户操作')
async def create_user():
    resp = ResponseModel(code=1, msg='成功')
    return resp.model_dump()

该方式也是定义视图最为常见的一种方式!

add_api_websocket_route()

add_api_websocket_route()用于添加websocket视图,相关参数如下:

  • path: 路径,接收一个str类型
  • endpoint: 执行函数,接收一个Callable类型
  • name: 为视图名称,接收一个str类型
  • dependencies: 为依赖项,可用来做一些额外操作(例如权限验证等)。用法与APIRouter一样

使用如下:

async def websocket_endpoint(user_id: UUID, websocket: WebSocket):
    print(111, user_id)
    await websocket.accept()
    while True:
        data = await websocket.receive_text()
        await websocket.send_text(f"Message Text was: {data}")

router.add_api_websocket_route("/{user_id:uuid}", websocket_endpoint)
app.include_router(router)
websocket_route()

websocket_route()为装饰器方法。

websocket()

websocket()为装饰器方法,其内部实现为调用了add_api_websocket_route()方法。

router = APIRouter(tags=['ws'])

@router.websocket("/{user_id:uuid}")
async def websocket_endpoint(user_id: UUID, websocket: WebSocket):
    print(111, user_id)
    await websocket.accept()
    while True:
        data = await websocket.receive_text()
        await websocket.send_text(f"Message Text was: {data}")

app.include_router(router)
include_router()

include_router()为添加路由模块。对于多模块应用,这也是最为常见的一种方式。相关参数介绍如下:

  • router: 接收一个APIRouter对象
  • prefix: 路由前缀
  • tags: 标签列表
  • dependencies: 依赖项,可用来做一些额外操作(例如权限验证等),接收一个Sequence[params.Depends]类型
  • deprecated: 用于表示是否过期,接收一个bool类型
  • include_in_schema: 是否在Swagger UI中包含该视图,接收一个bool类型,默认为True
  • default_response_class: 默认响应类,接收一个Response类型,默认是JSONResponse。所以当我们视图函数中只需要返回json所支持的类型数据即可,它会包装成JSON响应给到客户端
  • callbacks: 回调函数列表,不起作用
  • generate_unique_id_function: 生成唯一ID的方法,接收一个Callable对象
on_event()

on_event()装饰器方法,定义事件监听操作。使用如下:

@router.on_event('startup')
async def startup():
    print('app startup')

app.include_router(router)

FastAPI

FastAPI可以看做是一个特殊的APIRouterAPIRouter所支持的方法,FastAPI也基本都支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1165408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Midjourney入门教程2】Midjourney的基础操作和设置

文章目录 Midjourney的常用命令和基础设置1、 /imagine2、 /blend3、 /info4、 /subscribe5、 /settings(Midjourney的基础设置)6、 /shorten 有部分同学说我不想要英文界面的,不要慌: 点击左下角个人信息的设置按钮,找…

(2023最新版)总结 TCP 三挥四握的面试题

任 TCP 虐我千百遍,我仍待 TCP 如初恋。 TCP 基本认识 TCP 头格式有哪些? 我们先来看看 TCP 头的格式,标注颜色的表示与本文关联比较大的字段,其他字段不做详细阐述。 TCP 头格式 序列号:在建立连接时由计算机生成的…

C/C++苹果和虫子 2021年3月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C苹果和虫子 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C苹果和虫子 2021年3月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 你买了一箱n个苹果,很不幸的是买完时箱…

小程序day03

目标 页面导航 声明式导航 1.导航到tabBar页面 2.导航到非tabbar页面 3.后退导航 编程式导航 1.导航到tabBar页面 2.导航到非tabBar页面 3.后退导航 导航传参 1.声明式导航传参 2.编程式导航传参 3.在onLoad中接收导航参数 页面事件 下拉刷新 这个可以获取完数据之后再停止…

06、如何将对象数组里 obj 的 key 值变成动态的(即:每一个对象对应的 key 值都不同)

1、数据情况: 其一、从后端拿到的数据为: let arr [1,3,6,10,11,23,24] 其二、目标数据为: [{vlan_1: 1, value: 1}, {vlan_3: 3, value: 1}, {vlan_6: 6, value: 1}, {vlan_10: 10, value: 1}, {vlan_11: 11, value: 1}, {vlan_23: 23, v…

java--深刻认识面向对象

1.面向对象编程有啥好处 万物皆对象 汽车的数据,找汽车对象处理 手机的数据,找手机对象处理 学生的数据,找学生对象处理 符合人类思维习惯,编程更简单、更直观 2.程序中的对象到底是啥 对象本质上是一种特殊的数据结构(具体…

基于深度学习的目标检测算法 计算机竞赛

文章目录 1 简介2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 1 简介 &#x1f5…

安卓应用开发环境

安卓应用开发环境 安卓应用开发环境安卓Studio下载安装安卓Gradle下载安装 安装&构建问题Android Studio无法下载SDKSSH变体simple不支持设置端口cvc-complex-type.2.4.aFailed to find Build Tools revison 30.0.2Android Studio无法找到CMakeCMake was unable to …

lang_process() (一)

一、lang_process() 从现在开始介绍 lang_process()函数,是GNU ld(GNU链接器)的一个核心函数,负责执行链接过程中的各个关键操作。lang_process(void) 函数涵盖了整个链接过程中的各个关键步骤,包括符号解析、重定位、…

Spring Boot Actuator 漏洞利用

文章目录 前言敏感信息泄露env 泄露配置信息trace 泄露用户请求信息mappings 泄露路由信息heapdump泄露堆栈信息 前言 spring对应两个版本,分别是Spring Boot 2.x和Spring Boot 1.x,因此后面漏洞利用的payload也会有所不同 敏感信息泄露 env 泄露配置信…

【使用Python编写游戏辅助工具】第二篇:键盘监听的应用

前言 这里是【使用Python编写游戏辅助工具】的第二篇:键盘监听的应用。本文主要介绍使用Python实现事件监听功能。 键盘监听是指通过编程的方式监控用户在键盘上的按键操作。 在这里键盘监听的主要用途是: 监听我们按下的按键,如果按下了指…

@Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成

问题 Tag和Operation标签失效 但是Schema标签有效 pom依赖 <!-- 接口文档--><!--引入openapi支持--><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><vers…

最长回文子串-LeetCode5 动态规划

由于基础还不是很牢固 一时间只能想到暴力的解法: 取遍每个子串 总数量nn-1n-2…1 O(n^2) 判断每个子串是否属于回文串 O(n) 故总时间复杂度为O(n^3) class Solution { public:string longestPalindrome(string s) { int max0;string ret;for(int i0;i<s.size();i)for(int…

基于SSM+Vue的宠物用品电子商务平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

金山文档轻维表之删除所有行记录

目前脚本文档里面的只有删除行记录功能&#xff0c;但是需要指定ID值&#xff0c;不能实现批量删除&#xff0c;很多人反馈但是官方无回应&#xff0c;挺奇怪的 但是批量删除的需求我很需要&#xff0c;最后研究了一下&#xff0c;还是挺容易实现的 测试&#xff1a; 附上脚本…

年终总结一定用得上!这8款AI制作PPT软件不容错过。

PPT&#xff08;PowerPoint&#xff09;已成为日常商务办公、教育和营销环境中广泛使用的一种呈现工具。年终总结时&#xff0c;使用PPT能清晰、直观地展示一年的工作成果&#xff0c;从而让团队成员或上级领导更好地了解并评估工作表现。 在过去&#xff0c;创建精美和引人入…

[PHP]帮管客CRM客户管理系统 v5.1.0

帮管客CRM客户管理系统基于先进的CRM营销理念设计&#xff0c;集客户档案、销售记录、业务往来于一身&#xff0c;以凝聚客户关系、提升资源价值为核心&#xff0c;将潜在客户变为现实客户、从而提升销售量、提高用户的满意度&#xff0c;并增加企业竞争力。帮管客CRM是适用于中…

Redis4 渐进式遍历/自定义客户端/持久化

1.渐进式遍历 1.keys *一次性把所有的key都获取到.但是存在一个问题,一旦数据过多,redis就会被阻塞住,就无暇顾及其他的命令,这样的影响很大. 2.那么就出现了渐进式遍历,可以做到既能获取所有的key,又不会阻塞服务器.渐进式不是一个命令把所有的key获取到,而是没执行一次命令只…

MySQL的3种索引合并优化⭐️or到底能不能用索引?

MySQL的3种索引合并优化⭐️or到底能不能用索引? 前言 前文我们讨论过MySQL优化回表的多种方式&#xff1a;索引条件下推ICP、多范围读取MRR、覆盖索引等 这篇文章我们来聊聊MySQL提供的另一种优化回表的手段&#xff1a;index merge 索引合并 在阅读本文前&#xff0c;你…

windows + Mingw32-make 编译 PoDoFo库,openssl, libjpeg, Msys2工具的使用

参考&#xff1a; https://blog.csdn.net/sspdfn/article/details/104244306 https://blog.csdn.net/yaoyuanyylyy/article/details/17436303 https://blog.csdn.net/wxlfreewind/article/details/106492253 前期进行了各种摸索&#xff0c;由于Podofo依赖库比较多&#xff0c…