寫在前面
FastApi是python的異步Web框架,具有和Go,NodeJs相當的性能,總而言之,很快。當然還有一些相比於其他Web框架的優勢,例如支持了Swagger文檔,增加Python3.6+的數據類型指示功能,基於Pydantic的數據類型校驗等等。個人覺得有學一學必要,所在這寫下自己的學習記錄。
安裝
pip install fastapi
pip install uvicorn
其中uvicorn是一個ASGI(異步網關協議接口)服務器,介於網絡協議和Python應用之間的標準接口,而Flask框架使用的是WSGI(Web服務器網關協議接口)。
HelloWorld
新建一個main.py,在其中創建一個最簡單的應用
from fastapi import FastAPI
app = FastAPI() # 創建應用實例,uvicorn啓動時也基於這個實例
@app.get("/") # 定義了一個"/"根目錄的路由,直接返回了一個字符串
def hello_world():
return "Hello World"
應用的啓動方式有兩種,一種是通過命令行的方式啓動
uvicorn main:app
另一種是在main.py內部實現應用的啓動
import uvicorn
if __name__ == "__main__":
uvicorn.run("main:app")
'''或者使用uvicorn.run(app) 傳入fastapi的實例,但是這種情況下不允許設置reload和workers參數'''
uvicorn啓動參數(應用內啓動)
參數 | 說明 | 參數類型 | 默認值 |
---|---|---|---|
host | 綁定的IP地址 | String | 127.0.0.1 |
port | 綁定的端口 | Integer | 8000 |
reload | 是否自動重啓,開發階段適用 | Bool | False |
reload_dir | 自定義重啓的目錄 | Text | None |
workers | 工作進程數,當設置reload時,該參數不生效 | Integer | 1 |
log_level | 日誌級別 | Text | info |
access_log | 是否輸出訪問日誌 | Bool | True |
debug | debug模式,開啓後會自動重啓服務 | Bool | False |
proxy_headers | 允許X-Forward-* | Bool | True |
forwarded_allow_ips | 以逗號分割的IP列表,來自與這些IP的代理頭被新人 | Text | 127.0.0.1 |
root_path | (可選)指定應用所在的路徑 | Text | None |
limit_concurency | 併發限制 | Integer | None不限制 |
limit_max_requests | 到達進程前的最大連接數 | Integer | None不限制 |
backlog | 積壓的最大連接數 | Integer | 2048 |
timeout_keep_live | 超過多長時間自動關閉Keep-Alive連接 | Integer | 5 |
headers | 自定義響應頭 | List | 形如[(a, b)] |
獲取API文檔
訪問綁定的127.0.0.1:8000/doc 獲取SwaggerUI風格的API文檔
訪問綁定的127.0.0.1:8000/redoc 獲取ReDoc庚哥的API文檔
接口方法簡介
@app.get("/") # 定義了一個"/"根目錄的路由,直接返回了一個字符串
def hello_world():
return "Hello World"
其中app是FastApi的一個實例,在上文定義的。
get是http協議的方法,除了GET,還包括POST,PUT,DELETE等方法。一般情況下,GET用於獲取數據,POST用於創建數據,PUT用於更新數據,DELETE用於刪除數據。當然了,也可以根據自己的習慣,使用不同的辦法。
"/"是定義的路由,當服務器進行訪問時,只有匹配上該路由,才能映射到對應的接口函數。
hello_world是定義的接口函數,用於實現具體的操作。FastApi是一個異步框架,所以接口函數也可以定義成以下方式
@app.get("/") # 定義了一個"/"根目錄的路由,直接返回了一個字符串
async def hello_world():
return "Hello World"
官方文檔中對於選擇def還是async def也做了一個簡單的說明
1.如果使用的第三方庫告訴你調用的時候用await somefunc()的方式,使用async def
2.如果使用的第三方庫與數據庫,API等有交互時,並且不支持await調用方式,就使用def
3.如果不與其他交互和等待其他的響應,使用async def
4.如果你什麼都不知道,使用def
不管在那種情況下,FastApi都會以異步的方式來提高效率,但是根據不同的情況選擇合適的方式有助於性能優化。