前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >FastAPI(40)- 大型应用程序的项目拆分

FastAPI(40)- 大型应用程序的项目拆分

作者头像
小菠萝测试笔记
发布于 2021-10-09 03:38:31
发布于 2021-10-09 03:38:31
1.6K00
代码可运行
举报
运行总次数:0
代码可运行

背景

  • 假设要搭建一个测试平台,那么整个项目的 API 数量肯定很多个,他们不可能放在同一个文件中
  • FastAPI 提供了一个方便的工具来构建应用程序,同时保持所有的灵活性

项目架构

假设结构如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.
├── app
│   ├── __init__.py
│   ├── main.py
│   ├── dependencies.py
│   └── routers
│   │   ├── __init__.py
│   │   ├── items.py
│   │   └── users.py
│   └── internal
│       ├── __init__.py
│       └── admin.py
  • main:应用程序的主入口,会添加所有子路由
  • dependencies:存放应用程序要用到的依赖项
  • routers:子路由,根据模块划分,比如 users 存放用户信息相关的路由,items 存放其他内容的路由
  • internal:一些公共路由

APIRouter

有点像 Flask 里面的蓝图,为某个模块创建路径操作

users.py 代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog:  https://www.cnblogs.com/poloyy/
# time: 2021/9/28 7:26 下午
# file: users.py
"""

from fastapi import APIRouter, Depends, HTTPException
from dependencies import get_token_header

# 属于该模块的路由
user_router = APIRouter(
    # 这里配置的 tags、dependencies、responses 对这个模块的内的所有路径操作都生效
    # 路径前缀,该模块下所有路径操作的前缀
    prefix="/users",
    # 标签
    tags=["users"],
    # 依赖项
    dependencies=[Depends(get_token_header)],
    # 响应
    responses={404: {"description": "users Not found"}}
)


@user_router.get('/account/login')
async def login():
    return {}


@user_router.get('/account/logout')
async def logout():
    return {}


# 单独给某个路径操作声明 tags、responses
@user_router.put(
    "/{item_id}",
    tags=["custom"],
    responses={403: {"description": "路径专属 Operation forbidden"}},
)
async def update_item(item_id: str):
    if item_id != "plumbus":
        raise HTTPException(
            status_code=403, detail="You can only update the item: plumbus"
        )
    return {"item_id": item_id, "name": "The great Plumbus"}

items.py 代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog:  https://www.cnblogs.com/poloyy/
# time: 2021/9/28 7:26 下午
# file: items.py
"""

from fastapi import APIRouter, Depends
from dependencies import get_token_header

item_router = APIRouter(
    # 这里配置的 tags、dependencies、responses 对这个模块的内的所有路径操作都生效
    # 路径前缀,该模块下所有路径操作的前缀
    prefix="/items",
    # 标签
    tags=["items"],
    # 依赖项
    dependencies=[Depends(get_token_header)],
    # 响应
    responses={404: {"description": "items Not found"}}
)


@item_router.get('/item')
async def index():
    return {}


@item_router.get('/item/list')
async def list():
    return {}

routers/__init__.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from .items import item_router
from .users import user_router

admin.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog:  https://www.cnblogs.com/poloyy/
# time: 2021/9/28 7:26 下午
# file: admin.py
"""

from fastapi import APIRouter

admin_router = APIRouter()


@admin_router.post("/")
async def update_admin():
    return {"message": "Admin getting schwifty"}

common/__init__.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from .admin import admin_router

main.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog:  https://www.cnblogs.com/poloyy/
# time: 2021/9/28 7:25 下午
# file: main.py
"""
import uvicorn
from fastapi import FastAPI, Depends

# 导入子路由
from dependencies import get_query_token, get_token_header
from routers import user_router, item_router
from common import admin_router

# 主路由
app = FastAPI(
    # 声明全局依赖项
    # 如果每个 APIRouter 都会用到这个依赖项,那么应该声明为全局依赖项
    dependencies=[Depends(get_query_token)]
)

# 添加子路由
app.include_router(user_router)
app.include_router(item_router)
# 也可以在这里给子路由声明 prefix、tags、dependencies、responses,而无需修改原始的 APIRouter
app.include_router(
    router=admin_router,
    prefix="/admin",
    tags=["admin"],
    dependencies=[Depends(get_token_header)],
    responses={418: {"description": "I'm a teapot"}}
)


@app.get("/")
async def root():
    return {"message": "Hello Bigger Applications!"}


if __name__ == "__main__":
    uvicorn.run(app="main:app", host="127.0.0.1", port=8080, debug=True, reload=True)
重点
  • 使用 app.include_router() 可以将每个 APIRouter 添加到主 FastAPI 应用程序中,它将包括来自该路由器的所有路由作为它的一部分
  • 它实际上会在内部为 APIRouter 中声明的每个路径操作创建一个路径操作,因此,在幕后,它实际上会像所有东西都是同一个应用程序一样工作
  • 使用 app.include_router() 时,不必担心性能,只需要几微秒,并且只会在启动时发生,所以不会影响性能

主程序-子路由的架构图

  • 这个架构还是比较简单的,主程序直接包含子路由
  • 但其实子路由还可以再包含一个子路由
  • 个人把主程序也称为主路由(感觉更好理解)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
user_router = APIRouter(
    prefix="/users",
)

user_router.include_router(
    router=item_router
    prefix="/items"
)

FastAPI() 的 include_router() 源码

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-09-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
FastAPI学习-10. 路由管理APIRouter
在 Flask 中,我们一般用蓝图 Blueprint 来处理多个模块的视图,在fastapi 中也有类似的功能通过APIRouter 来管理。
上海-悠悠
2023/09/21
8500
FastAPI学习-10. 路由管理APIRouter
全面拥抱FastApi — 蓝图APIRouter
我们都知道在大型的应用程序或者 web api 中, 我们很少在一个文件中写入多个路由
Python编程与实战
2021/02/08
1.7K0
fastapi 安全性 / APIRouter / BackgroundTasks / 元数据 / 测试调试
learn from https://fastapi.tiangolo.com/zh/tutorial/security/first-steps/
Michael阿明
2022/01/07
1.2K0
fastapi 安全性 / APIRouter / BackgroundTasks / 元数据 / 测试调试
FastAPI官方教程太棒了(下)
status_code也可以是IntEnum,比如Python的http.HTTPStatus。
dongfanger
2022/11/21
2.7K0
FastAPI官方教程太棒了(下)
全面拥抱 FastApi — 多应用程序项目结构规划
FastAPI最近比较火,自从看到这款框架后就一直在关注着。据官方文档上的介绍它是一个并发性可以和 NodeJS 以及 Go 相媲美的 web 框架,具有强大的性能
Python编程与实战
2020/04/01
2.3K0
fastapi(一)
目录结构, 由于我也是刚开始学这个框架,只是了解了怎么注册蓝图,JWT的集成,数据库的集成,想了解更多,自行打开官方文档去详细阅读。fastapi官网文档链接
Wyc
2022/01/05
8870
fastapi(一)
FastAPI 学习之路(三十七)引入APIRouter
我们之前分享分享使用FastAPI 学习之路(三十六)项目结构优化,这次我们分享APIRouter的使用。
雷子
2021/09/17
4.1K0
FastAPI(33)- Global Dependencies 全局依赖
背景 对于某些实际应用场景,希望向整个应用程序添加一个全局依赖项 FastAPI 类的 dependences 参数 dependences 类型指定为 Optional[Sequence[Depends]] Sequence 是序列,不仅可以接收 List,还可以接收 Set、Tuple 等 子类型就是 Depends 实际代码 #!usr/bin/env python # -*- coding:utf-8 _*- """ # author: 小菠萝测试笔记 # blog: https://w
小菠萝测试笔记
2021/09/27
6440
(进阶篇)Python web框架FastAPI——一个比Flask和Tornada更高性能的API 框架
上一篇已经初步了解了 FastAPI 的基本使用,但是如果想要真正把 FastAPI 部署上线到服务器,那么你需要了解更多,学习更多。所以本篇内容将注重于 FastAPI 的项目生产环境,诸如 数据库,路由蓝图,数据验证等问题在 FastAPI 中的具体操作和一些自己碰到的坑,分享给正在进攻 FastAPI 的各位小伙伴。
Python进阶者
2020/04/08
2.6K0
(进阶篇)Python web框架FastAPI——一个比Flask和Tornada更高性能的API 框架
FastAPI 学习之路(五十七)对之前的代码进行优化
我们之前分享FastAPI 学习之路(五十六)校验是否登陆,这次我们将之前的代码进行优化。
雷子
2021/10/12
4170
如何结合FastAPI和GraphQL来设计一个可扩展的项目架构
随着现代应用程序的复杂性和对高效数据传输需求的增加,GraphQL已经成为开发者们在构建API时的一种流行选择。而FastAPI作为一个现代、快速(高性能)的Python web框架,非常适合构建高性能的GraphQL服务。本文将详细介绍如何结合FastAPI和GraphQL来设计一个可扩展的项目架构。
IT蜗壳-Tango
2024/07/01
3700
FastAPI 学习之路(三十七)元数据和文档 URL
我们之前分享分享使用FastAPI 学习之路(三十七)引入APIRouter,这次我们分享元数据和文档 URL。
雷子
2021/09/17
7080
FastAPI(43)- 基于 pytest + requests 进行单元测试
https://www.cnblogs.com/poloyy/tag/Pytest/
小菠萝测试笔记
2021/10/09
1.7K0
FastAPI(43)- 基于 pytest + requests 进行单元测试
FastAPI(15)- 声明请求示例数据
可以使用 Config cass 和 schema_extra 为 Pydantic Model 声明一个示例值
小菠萝测试笔记
2021/09/27
8920
FastAPI从入门到实战(13)——常见配置项
九陌斋地址:https://blog.jiumoz.com/archives/fastapi-cong-ru-men-dao-shi-zhan-13-chang-jian-pei-zhi-xiang
MinChess
2022/12/27
1.8K0
FastAPI从入门到实战(13)——常见配置项
FastAPI(27)- Handling Errors 处理错误
当请求包含无效数据时,FastAPI 会在内部引发 RequestValidationError,它还包括一个默认的异常处理程序
小菠萝测试笔记
2021/09/27
1.1K0
FastAPI后台开发基础(15): 依赖注入
在 FastAPI 中,依赖项可以是任何可调用的对象,如函数、类方法等。这些依赖项可以接受参数,这些参数同样可以是其他依赖项,从而形成依赖关系链。FastAPI 会自动处理这些依赖关系,确保在调用主功能(如API路由处理函数)之前,所有依赖项都已正确解析和调用。
bowenerchen
2024/11/18
2091
FastAPI后台开发基础(15): 依赖注入
FastAPI(56)- 使用 Websocket 打造一个迷你聊天室
await websocket.receive_text() 将引发 WebSocketDisconnect 异常,这不是期望看到的结果
小菠萝测试笔记
2021/10/09
9380
FastAPI(56)- 使用 Websocket 打造一个迷你聊天室
FastAPI(七十四)实战开发《在线课程学习系统》接口开发-- 创建课程
我们上一次分享了实战FastAPI(七十三)实战开发《在线课程学习系统》接口开发-- 删除留言,本次分享创建课程。
雷子
2021/11/04
5900
FastAPI(14)- 路径操作函数参数的类型是一个嵌套 Pydantic Model 的使用场景
tags 虽然声明为 Set(),但在接口层面并没有集合这个概念,所以还是传数组 [ ] 格式哦,并不是传 { } 哦
小菠萝测试笔记
2021/09/27
7520
推荐阅读
相关推荐
FastAPI学习-10. 路由管理APIRouter
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文