全面擁抱 FastApi — 多應用程序項目結構規劃


點擊「 Python編程與實戰 」,選擇「置頂公衆號」

第一時間獲取 Python 技術乾貨!web


FastAPI最近比較火,自從看到這款框架後就一直在關注着。據官方文檔上的介紹它是一個併發性能夠和 NodeJS 以及 Go 相媲美的 web 框架,具備強大的性能編程

本人最近也是一直在使用和學習 FastApi,相比以前用的框架性能確實有很大的提高,用完後有以下幾點感覺:api

  • 性能併發更強了,支持異步 async
  • 基於 Pydantic 的類型聲明,自動校驗參數
  • 自動生成交互式的 API 接口文檔
  • 上手簡單,能快速編碼

上手快是真的,上班期間零零散散的看了兩天文檔,就將現有的一個服務改爲 FastApi 服務了,配合 gunicorn+uvicorn 部署,最近測試也沒出現什麼問題。服務器

因爲以前 Flask 用的比較多,在 FastAPI 上隱隱約約能看到 Flask 的影子,二者的設計範式很相似。微信

例如:更大的應用程序服務多文件多 url 處理功能,在 Flask 中稱之爲藍圖的,對應 FastApI 中的 APIRouter併發

Flask 藍圖機制及應用
app

使用 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 個或者更多呢?這時候就不建議寫在一個文件裏面了,由於代碼不易維護且顯得臃腫async

這時候便要考慮將視圖函數分文件處理了,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 異步 ASGI 服務器及框架

Python爬蟲偷懶神器—快速構造請求頭!




THANKS

- End -



點個「在看」必升職加薪喔

本文分享自微信公衆號 - Python編程與實戰(GoPy1024)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索