专栏首页Python编程与实战全面拥抱 FastApi — 多应用程序项目结构规划

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

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("/")
async def index():
    return "Hello world"


@app.get("/items/{item_id}")
async def read_item(item_id: str, q: str = None, short: bool = False):
    item = {"item_id": item_id}
    if q:
        item.update({"q": q})
    if not 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"])
async def read_users():
    return [{"username": "Foo"}, {"username": "Bar"}]

@router.get("/users/me", tags=["users"])
async def 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"])
async def read_users():
    return [{"username": "Foo"}, {"username": "Bar"}]

@router.get("/users/me", tags=["users"])
async def 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

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

本文分享自微信公众号 - Python编程与实战(GoPy1024),作者:Jerryning

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 当你写爬虫抓不到APP请求包的时候该怎么办?【初级篇】

    文中均为 Android 环境下,实战中可以尝试降低 APP 版本或是尝试抓一下 iOS 版 APP 的包(如果有),但不建议太过依赖 iOS 版 APP

    Python编程与实战
  • 全面拥抱FastApi —三大参数及验证

    可能对于有些没有基础的朋友看起来会有点懵,所以后面会按照由浅及深的顺序进行更新,记得关注噢!

    Python编程与实战
  • 详解Flask中session与cookie的用法

    做过爬虫的朋友相信对 session 和 cookie 这两个东西非常的熟悉了,简单点说 cookie 是客户端用来标识用户信息的,session 是一种会话机...

    Python编程与实战
  • 用Docker搭建Laravel开发环境

    在这篇文章中我们将通过Docker在个人本地电脑上构建一个快速、轻量级、不依赖本地电脑所安装的任何开发套件的可复制的Laravel和Vue项目的开发环境(开发环...

    KevinYan
  • Docker学习之SSH连接docker容器

    不论是开发者是运维人员,都经常有需要进入容器的诉求,目前看,主要的方法不外乎以下几种:

    小柒2012
  • Docker学习之SSH连接docker容器

    前言 不论是开发者是运维人员,都经常有需要进入容器的诉求,目前看,主要的方法不外乎以下几种: 使用ssh登陆进容器,需要在容器中安装启动sshd,存在开销和攻击...

    小柒2012
  • Docker学习之SSH连接docker容器

    不论是开发者是运维人员,都经常有需要进入容器的诉求,目前看,主要的方法不外乎以下几种:

    小柒2012
  • Linux 下从头再走 GTK+-3.0 (一)

      原本由于项目需求在 Linux 下学习过一段时间的 GTK+2.0 图形开发,时隔一段时间,想真正深入学习一下 GTK 。

    RainMark
  • 漫漫人生路总会错几步python之retry

    如果自动化中失败了一次,我们给机会了,成功了就既往不咎。只能说明不够稳定。那么retry该如何写呢?

    赵云龙龙
  • 区块链im及时通讯系统app开发

    Im即时通讯系统app是现在市场中应用比较广泛的产品,像我们现在使用的微信、QQ等等都属于im即时通讯系统app。Im的范围比较大,现在很多的行业都会有自己行内...

    v13823115027

扫码关注云+社区

领取腾讯云代金券