全面拥抱 FastApi — 多应用程序项目结构规划

简介: 全面拥抱 FastApi — 多应用程序项目结构规划

640.jpg

FastAPI最近比较火,自从看到这款框架后就一直在关注着。据官方文档上的介绍它是一个并发性可以和 NodeJS 以及 Go 相媲美的 web 框架,具有强大的性能

本人最近也是一直在使用和学习 FastApi,相比之前用的框架性能确实有很大的提升,用完后有如下几点感受:

  • 性能并发更强了,支持异步 async
  • 基于 Pydantic 的类型声明,自动校验参数
  • 自动生成交互式的 API 接口文档
  • 上手简单,能快速编码

上手快是真的,上班期间零零散散的看了两天文档,就将现有的一个服务改成 FastApi 服务了,配合 gunicorn+uvicorn 部署,最近测试也没出现什么问题。

由于之前 Flask 用的比较多,在 FastAPI 上隐隐约约能看到 Flask 的影子,两者的设计范式很类似。

例如:更大的应用程序服务多文件多 url 处理功能,在 Flask 中称之为蓝图的,对应 FastApI 中的 APIRouter

Flask 蓝图机制及应用

使用 APIRouter

上面说过和 Flask 非常的类似,比如创建一个简单的 FastAPI 服务

from fastapi import FastAPI
app = FastAPI()
@app.get("/")
asyncdef index():
    return"Hello world"
@app.get("/items/{item_id}")
asyncdef read_item(item_id: str, q: str = None, short: bool = False):
    item = {"item_id": item_id}
    if q:
        item.update({"q": q})
    ifnot short:
        item.update(
            {"description": "This is an amazing item that has a long description"}
        )
    return item

上述代码中有两个视图函数以及 url 路径,现在这种情况看起来还好

但是如果服务中视图函数有 10 个或者更多呢?这时候就不建议写在一个文件里面了,因为代码不易维护且显得臃肿

这时候便要考虑将视图函数分文件处理了,APIRouter 就给我们提供了在多个文件中注册路由的功能。

类似生活中的常用的插线板,能提供更多的插口插入电器插头,然后我们最终只需要将这一个或多个插线板 (APIRouter) 插到主线路 (app = FastAPI() ) 即可

比如服务中两个应用模块,combination 和 level 分别对应两个应用模块,通过 APIRouter 来对其路由进行注册,用法如下:

combination.py

from fastapi import APIRouter
router = APIRouter()
@router.get("/users/", tags=["users"])
asyncdef read_users():
    return [{"username": "Foo"}, {"username": "Bar"}]
@router.get("/users/me", tags=["users"])
asyncdef read_user_me():
    return {"username": "fakecurrentuser"}

相应的 level.py 也能这样写,但是你是否会发现创建了两个 APIRouter() 的对象

这样当然也是可以的,官方文档就是这样举例的,你甚至可以创建更多。不过我觉得两个应用创建两个 router 感觉有点 "浪费", 我们是否可以这样:只创建一个 router ,然后在每个模块导入创建好的 router,当然也是可以,效果一样

这部分就是另起文件,创建 router, 代码非常简单,但是记住要导入模块对应视图函数,

routers.py

from fastapi import APIRouter
router = APIRouter()
from ..combination import views
from ..level2 import views

接下来就是在模块视图函数中导入上述创建好的 router

from app.routers import router
@router.get("/users/", tags=["users"])
asyncdef read_users():
    return [{"username": "Foo"}, {"username": "Bar"}]
@router.get("/users/me", tags=["users"])
asyncdef read_user_me():
    return {"username": "fakecurrentuser"}

另外一个模块也是一样的导入,代码就不贴了,理解就行

注册 APIRouter

最后一个步骤就是要将我们的 APIRouter 注册到核心对象上去,就像前面举的示例将插线板插到主线路插口上

和之前我们创建主文件一样导入 FastApi

from fastapi import FastAPI
app = FastAPI()
app.include_router(routers.router, prefix="/api")

其中 include_router() 函数就是上面说的注册。

这时候就完成了,使用该 app 来启动服务即可。当然你也可以将该核心对象包装成函数返回,然后在主目录调用启动,

def create_app():
    app = FastAPI()
    app.include_router(routers.router, prefix="/nlp_service")
    return app

主目录中创建 main.py 文件调用启动,

from app import create_app
app = create_app()

启动命令:

uvicorn main:app --host=0.0.0.0 --port=8800

640.png


本节完!敬请期待后续更多更新



相关文章
|
1月前
|
资源调度 前端开发 测试技术
前端工程化实践:从零搭建现代化项目构建流程
【4月更文挑战第6天】本文介绍了前端工程化的概念和重要性,包括模块化、自动化、规范化和CI/CD。接着,讨论了选择合适的工具链,如包管理器、构建工具和测试框架。然后,详细阐述了如何从零开始搭建一个基于React的现代化项目构建流程,涉及初始化、代码规范、测试、CSS处理、代码分割和CI/CD配置。最后,提到了持续优化与迭代的方向,如性能优化、类型检查和微前端。通过这样的实践,开发者可以提升开发效率和代码质量,为项目长远发展奠定基础。
39 0
|
2月前
|
开发工具 C语言 C++
CMake构建大型C/C++项目:跨平台设计与高级应用(二)
CMake构建大型C/C++项目:跨平台设计与高级应用
47 0
|
2月前
|
缓存 前端开发 JavaScript
Vite 构建流程大揭秘:快速构建前端项目的秘密武器
Vite 构建流程大揭秘:快速构建前端项目的秘密武器
|
存储 JSON 资源调度
10分钟带你从0到1搭建monorepo 工程化项目(一)
前言 大家好,我是Fly哥, 之前写博客的仓库,还是用的原生的html 和js 也没有引入 ts , 和一些工程化的东西, 所以自己重新搭建了一套前端项目架构 基于 lerna + yarn 的 monrepo的仓库, 主要是后面会学习输出的一些东西, 整个架子先搭建起来。 2d 和 3d 公共 util 的封装 个人 npm 包的发布 (rollup) 2d react 项目 搭建(vite) 3d react 项目 搭建 (webpack) 搭建一套基于webpack 5 的cli 每个项目都有一些特定的依赖, 但是也会有一些相同的依赖。比如eslint、 babel 的一些基础配置,
10分钟带你从0到1搭建monorepo 工程化项目(一)
|
2月前
|
编译器 持续交付 项目管理
CMake构建大型C/C++项目:跨平台设计与高级应用(三)
CMake构建大型C/C++项目:跨平台设计与高级应用
56 0
|
2月前
|
编译器 Linux C语言
CMake构建大型C/C++项目:跨平台设计与高级应用(一)
CMake构建大型C/C++项目:跨平台设计与高级应用
85 0
|
8月前
|
存储 API 数据安全/隐私保护
项目重要技术点介绍
项目重要技术点介绍
|
9月前
|
前端开发 API 数据处理
TienChin 项目改造完善&项目结构分析
Banner 生成网站:https://bootschool.net/ascii
79 0
|
存储 缓存 资源调度
Monorepo,大型前端项目管理模式实践
阅读本文您将了解到:什么是 monorepo、为什么要 monorepo、如何实践 monorepo。
6002 50
Monorepo,大型前端项目管理模式实践
|
存储 资源调度 前端开发
10分钟带你从0到1搭建monorepo 工程化项目(二)
eslint 对于eslint 的配置其实我们可以如法炮制,我们项目的根目录 新建 .eslintrc 然后我们每个子项目 同样继承外部的 .eslintrc 好的下面我们开始安装 eslint yarn add eslint -D -W 然后我们生成eslint 的配置文件 npx eslint --init 由于我们的项目 是基于 React 和 ts 的 所以在选择的按照下面进行选择 图片 eslint-config 这时候在我们的根目录 就会出现**.eslint.yml** 这个配置文件 这里你也可以选择你喜欢的配置文件格式, 个人比较喜欢YAML 这种方式 env:
10分钟带你从0到1搭建monorepo 工程化项目(二)