最近一直在研究一個新的 Python 語言的API,在一位同事的建議下,我們決定使用 Fastapi 作為我們的框架。
Fastapi是一個基于python的框架,該框架鼓勵使用Pydantic和OpenAPI(以前稱為Swagger)進行文檔編制,使用Docker進行快速開發(fā)和部署以及基于Starlette框架進行的簡單測試。
它提供了許多好處,例如自動OpenAPI驗證和文檔編制,而無需添加不必要的膨脹。我認為,在不提供任何內(nèi)置功能與提供太多內(nèi)置功能之間取得很好的平衡。
入門
安裝 fastapi 和 ASGI 服務(wù)器(例如uvicorn):
確保您使用的是Python 3.6.7+ 如果 pip
和python
給您python 2版本,則可能必須使用 pip3
和 python3
。另外,請查看我關(guān)于python入門的文章。
pip install fastapi uvicorn
并在main.py
文件中添加舊的“ hello world”:
from fastapi import FastAPI app = FastAPI() @app.get("/") def home(): return {"Hello": "World"}
運行開發(fā)
然后運行以進行開發(fā),可以運行uvicorn main:app --reload
這就是簡單服務(wù)器要做的全部!現(xiàn)在您可以檢查 //localhost:8000/ 以查看“主頁”。而且,如您所見,JSON響應(yīng)“正常工作”!您還可以通過 //localhost:8000/docs 免費獲得Swagger UI。
驗證
如前所述,很容易驗證數(shù)據(jù)(并為接受的數(shù)據(jù)格式生成Swagger文檔)。只需從fastapi添加Query
導(dǎo)入,然后使用它來強制驗證:
from fastapi import FastAPI, Query @app.get('/user') async def user( *, user_id: int = Query(..., title="The ID of the user to get", gt=0) ): return { 'user_id': user_id }
第一個參數(shù)...
是默認值,如果用戶不提供值則提供該默認值。如果設(shè)置為None
,則沒有默認值,并且該參數(shù)是可選的。為了沒有默認值并且該參數(shù)是強制性的,請使用Ellipsis ,或...
代替。
如果運行此代碼,則會在swagger UI上自動看到更新:
Swagger UI允許您查看新的/ user路由并使用特定的用戶ID進行請求
如果您輸入任何用戶ID,您會看到它會自動為您執(zhí)行請求,例如 //localhost:8000/user?user_id=1。在頁面中,您只能看到回顯了用戶ID!
如果要改為使用路徑參數(shù)(以使其為 /user/1
,則只需輸入并使用Path
而不是Query
。也可以結(jié)合兩者
Post 路線
如果您有POST
路由,則只需定義輸入即可
@app.post('/user/update') async def update_user( *, user_id: int, really_update: int = Query(...) ): pass
在這種情況下,您可以看到user_id
僅被定義為一個沒有Query
或Path
的整數(shù);這意味著它將在POST請求正文中。如果您接受更復(fù)雜的數(shù)據(jù)結(jié)構(gòu),例如JSON數(shù)據(jù),則應(yīng)研究請求模型。
請求和響應(yīng)模型
您可以使用Pydantic模型記錄并聲明詳細的請求和響應(yīng)模型。這不僅可以讓您擁有所有模型的自動OpenAPI文檔,而且還可以驗證請求模型和響應(yīng)模型,以確保輸入的任何POST數(shù)據(jù)都是正確的,并且返回的數(shù)據(jù)也符合該模型。
只需像這樣聲明模型:
from pydantic import BaseModel class User(BaseModel): id:: int name: str email: str
然后,如果您希望將用戶模型作為輸入,則可以執(zhí)行以下操作:
async def update_user(*, user: User): pass
或者,如果您要將其用作輸出:
@app.get('/user') async def user( *, user_id: int = Query(..., title="The ID of the user to get", gt=0), response_model=User ): my_user = get_user(user_id) return my_user
路由和分解更大的API
您可以使用APIRouter
將api分解為路由。例如,我已經(jīng)在我的 API 中找到了這個app / routers / v1 / __ init __。py
from fastapi import APIRouter from .user import router as user_router router = APIRouter() router.include_router( user_router, prefix='/user', tags=['users'], )
然后您可以在app / routers / v1 / user.py
中使用上面的用戶代碼-只需導(dǎo)入APIRouter
并使用@ router.get('/')< aaaa>
而不是 @ app.get('/ user')
。它會自動路由到 / user /
,因為該路由是相對于前綴的。
from fastapi import APIRouter router = APIRouter() @router.get('/') async def user( *, user_id: int = Query(..., title="The ID of the user to get", gt=0), response_model=User ): my_user = get_user(user_id) return my_user
最后,要在應(yīng)用程序中使用所有v1
路由器,只需將main.py
編輯為:
from fastapi import FastAPI from app.routers import v1 app = FastAPI() app.include_router( v1.router, prefix="/api/v1" )
您可以通過這種方式隨意鏈接路由器,從而允許您拆分大型應(yīng)用程序并擁有版本化的API。
Dockerizing and Deploying
Fastapi 的作者使出乎意料的輕松之一就是 Dockerizing!默認的Dockerfile
是2行!
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7 COPY ./app /app
是否想通過自動重新加載進行 Dockerize 開發(fā)?這是我在撰寫文件中使用的秘方:
version: "3" services: test-api: build: .. entrypoint: '/start-reload.sh' ports: - 8080:80 volumes: - ./:/app
這會將當前目錄掛載為app
并將在任何更改時自動重新加載。您可能還想將app / app
用于更大的應(yīng)用程序。
有用的網(wǎng)址
所有這些信息都來自 Fastapi網(wǎng)站,該文檔具有出色的文檔,我鼓勵您閱讀。此外,作者在 Gitter 上非?;钴S并樂于助人!
結(jié)論
就是這樣-我希望本指南對您有所幫助,并且您會像我一樣喜歡使用 Fastapi。
推薦教程:Python教程