zoukankan      html  css  js  c++  java
  • 全面拥抱 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编程与实战 

  • 相关阅读:
    Android数据存储
    linux中uptime命令查看linux系统负载
    Linux系统中的load average
    Trie树(c++实现)
    模版
    重载操作符[]
    stanford-postagger中文词性标注
    数值的整数次方(剑指offer面试题11)
    __init__ 和 self
    python中文分词:结巴分词
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13164837.html
Copyright © 2011-2022 走看看