Python 框架 FastAPI詳解
FastAPI是一種現(xiàn)代、快速(高性能)的Web框架,用于Python 3.6+,使用Python類型提示構(gòu)建API。它的設(shè)計初衷是幫助開發(fā)者在短時間內(nèi)開發(fā)出高性能的API服務(wù)。FastAPI的靈感來源于許多高性能的編程框架,包括Express、Django REST Framework和Flask,但它提供了一些特定的特性和優(yōu)化,使其脫穎而出。

什么是FastAPI?
FastAPI實現(xiàn)并支持了Python中的類型提示,使開發(fā)者能夠在編寫代碼時更加高效和可靠。它不僅簡化了API的開發(fā)過程,還在性能方面做出了顯著貢獻(xiàn)。FastAPI能夠在多種情況下提供出色的吞吐量和低延遲,使其非常適合構(gòu)建快速和可擴(kuò)展的Web服務(wù)。

FastAPI的主要特性包括:
- 快速:FastAPI是當(dāng)前最快的Python網(wǎng)絡(luò)框架之一,就像NodeJS和Go這樣的系統(tǒng)語言。它使用Starlette(用于網(wǎng)絡(luò)部分)和Pydantic(用于數(shù)據(jù)部分)進(jìn)行優(yōu)化。
- 簡單:開發(fā)者可以在數(shù)分鐘內(nèi)無痛地創(chuàng)建API。
- 基于標(biāo)準(zhǔn):遵循OpenAPI和JSON Schema標(biāo)準(zhǔn),讓我們能夠自動生成交互式文檔和數(shù)據(jù)驗證。
- 自動生成的交互式API文檔:Swagger UI和ReDoc界面。
- Python 3.6+類型提示讓代碼自動完成,極大提升開發(fā)體驗。
- 生產(chǎn)就緒:適合生產(chǎn)環(huán)境應(yīng)用的代碼。
安裝FastAPI
在開始使用FastAPI之前,你需要確保你的Python環(huán)境已經(jīng)配置好,然后你可以通過以下命令安裝FastAPI:
pip install fastapi
為了運(yùn)行FastAPI應(yīng)用,我們還需要一個ASGI服務(wù)器,例如uvicorn:
pip install uvicorn

開始使用FastAPI
讓我們從一個簡單的示例應(yīng)用開始,該應(yīng)用提供了一個基本的“Hello, World!”服務(wù)。
創(chuàng)建一個文件名為main.py,代碼如下:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}要運(yùn)行這個應(yīng)用,使用以下命令:
uvicorn main:app --reload
main:指的是Python文件(不包括.py擴(kuò)展名)。app:是FastAPI實例的名字。--reload:啟用自動重載,在代碼更改時自動重啟服務(wù)器。適合開發(fā)模式使用。
打開瀏覽器訪問http://127.0.0.1:8000,你將看到一個簡單的JSON響應(yīng):{"Hello": "World"}。
此外,F(xiàn)astAPI會為你自動生成API文檔。使用Swagger UI訪問http://127.0.0.1:8000/docs,或者使用ReDoc訪問http://127.0.0.1:8000/redoc。
定義請求方法

FastAPI支持幾種常見的HTTP方法:GET、POST、PUT、DELETE等。讓我們創(chuàng)建一個簡單的示例,演示如何使用這些HTTP方法:
from fastapi import FastAPI
app = FastAPI()
# GET請求:獲取信息
@app.get("/")
async def root():
return {"message": "Hello World"}
# POST請求:創(chuàng)建新資源
@app.post("/items/")
async def create_item(item: dict):
return {"item_name": item.get("name")}
# PUT請求:更新資源
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: dict):
return {"item_id": item_id, "item_name": item.get("name")}
# DELETE請求:刪除資源
@app.delete("/items/{item_id}")
async def delete_item(item_id: int):
return {"item_id": item_id}在FastAPI中,通過Python的類型提示系統(tǒng),我們可以方便地定義和解析路徑參數(shù)、請求體、查詢參數(shù)和表單數(shù)據(jù)。
路徑參數(shù)

FastAPI通過使用類型提示來定義路徑參數(shù):
from fastapi import FastAPI
app = FastAPI()
@app.get("/users/{user_id}")
async def read_user(user_id: int):
return {"user_id": user_id}在這里,路徑參數(shù)user_id定義為一個整數(shù)。FastAPI會自動驗證傳遞的參數(shù)是否為整數(shù),并在不匹配時返回一個400錯誤響應(yīng)。
查詢參數(shù)
除了路徑參數(shù),F(xiàn)astAPI還支持查詢參數(shù)。它們是定義在URL路徑之后的可選參數(shù),通常用于過濾和分頁:
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
return {"skip": skip, "limit": limit}在/items/路徑上,skip和limit是可選的查詢參數(shù),具有默認(rèn)值skip=0和limit=10。
請求體

FastAPI支持請求體數(shù)據(jù)的聲明和驗證。通常,POST、PUT等請求會需要一個請求體:
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
return item在這里,我們使用Pydantic模型來定義請求體的結(jié)構(gòu)和類型。FastAPI會驗證和解析請求體中的數(shù)據(jù),并將其作為參數(shù)傳遞給路徑操作函數(shù)。
數(shù)據(jù)驗證和自動文檔
FastAPI利用Pydantic進(jìn)行數(shù)據(jù)驗證,并自動生成API文檔。當(dāng)你運(yùn)行FastAPI應(yīng)用時,它會生成兩個API文檔界面,分別是Swagger UI和ReDoc。

- Swagger UI:
http://127.0.0.1:8000/docs– 提供了一個交互式的API文檔,你可以在瀏覽器中測試所有API操作。 - ReDoc:
http://127.0.0.1:8000/redoc– 另一個自動生成的API文檔界面,風(fēng)格簡潔。
異步支持
FastAPI完全支持異步編程,它完全利用Python中的async和await特性。在定義路徑操作函數(shù)時,可以通過async def來聲明異步操作:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}異步編程能夠幫助服務(wù)器處理更多請求,使其能夠更快地響應(yīng)客戶端,尤其在I/O密集型環(huán)境中。結(jié)合uvicorn或任何ASGI兼容服務(wù)器,F(xiàn)astAPI能夠?qū)崿F(xiàn)真正的并發(fā)操作。
中間件與擴(kuò)展

中間件是一個能夠在請求或響應(yīng)期間處理數(shù)據(jù)的函數(shù)。FastAPI提供簡單的方式來編寫中間件,這有助于在應(yīng)用中引入額外的功能,例如請求/響應(yīng)日志、CORS處理、安全措施等。
下面是一個簡單的中間件示例,用于記錄請求時間:
from fastapi import FastAPI
from starlette.middleware.base import BaseHTTPMiddleware
import time
app = FastAPI()
class TimingMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request, call_next):
start_time = time.time()
response = await call_next(request)
process_time = time.time() - start_time
response.headers["X-Process-Time"] = str(process_time)
return response
app.add_middleware(TimingMiddleware)CORS(跨域資源共享)
在現(xiàn)代Web應(yīng)用開發(fā)中,CORS是一個常見的問題。FastAPI提供了一種簡單的方式來處理CORS問題,你可以通過安裝starlette.middleware.cors.CORSMiddleware來實現(xiàn):
from fastapi import FastAPI
from starlette.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 允許訪問的源
allow_credentials=True,
allow_methods=["*"], # 允許的HTTP方法
allow_headers=["*"], # 允許的HTTP表頭
)通過以上配置,你可以實現(xiàn)從不同源的客戶端訪問FastAPI應(yīng)用。你可以根據(jù)實際需求調(diào)整允許的來源、方法和表頭。
數(shù)據(jù)庫集成

FastAPI是一個輕量級框架,可以很容易地與多種數(shù)據(jù)庫集成。在構(gòu)建生產(chǎn)級應(yīng)用時,數(shù)據(jù)庫是必不可少的一部分。其中SQLAlchemy是Python中常用的ORM框架,我們可以利用它與FastAPI進(jìn)行集成:
首先,安裝SQLAlchemy和數(shù)據(jù)庫驅(qū)動:
pip install sqlalchemy pip install databases
接下來,定義數(shù)據(jù)庫配置和模型:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
class Item(Base):
__tablename__ = 'items'
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True)
description = Column(String, index=True)創(chuàng)建數(shù)據(jù)庫會話和路徑操作:
from fastapi import Depends, FastAPI, HTTPException
from sqlalchemy.orm import Session
from typing import List
app = FastAPI()
Base.metadata.create_all(bind=engine)
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@app.post("/items/", response_model=Item)
def create_item(item: Item, db: Session = Depends(get_db)):
db.add(item)
db.commit()
db.refresh(item)
return item
@app.get("/items/", response_model=List[Item])
def read_items(skip: int = 0, limit: int = 10, db: Session = Depends(get_db)):
items = db.query(Item).offset(skip).limit(limit).all()
return items在上面的代碼中,我們定義了一個SQLAlchemy數(shù)據(jù)庫模型,同時創(chuàng)建了CRUD操作,包括創(chuàng)建(POST)和讀?。℅ET)功能。通過Depends依賴注入,我們將數(shù)據(jù)庫會話傳遞給路徑操作函數(shù),使我們能夠輕松管理數(shù)據(jù)庫事務(wù)。
全面總結(jié)
FastAPI是一個強(qiáng)大且高效的Web框架,適合從小型項目到大型企業(yè)級應(yīng)用的各種開發(fā)需求。因為它的自動文檔、數(shù)據(jù)驗證和優(yōu)秀的性能,F(xiàn)astAPI在編寫現(xiàn)代Web服務(wù)時提供了巨大的便捷性。結(jié)合異步、CORS、中間件和數(shù)據(jù)庫集成功能,F(xiàn)astAPI能夠幫助開發(fā)者快速構(gòu)建穩(wěn)健的API服務(wù)。我們強(qiáng)烈推薦在你的下一個項目中試用FastAPI,并享受其帶來的高效開發(fā)體驗。
到此這篇關(guān)于Python 框架 FastAPI的文章就介紹到這了,更多相關(guān)Python 框架 FastAPI內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python多線程編程(八):使用Event實現(xiàn)線程間通信
這篇文章主要介紹了Python多線程編程(八):使用Event實現(xiàn)線程間通信,,需要的朋友可以參考下2015-04-04
擴(kuò)展Django admin的list_filter()可使用范圍方法
今天小編就為大家分享一篇擴(kuò)展Django admin的list_filter()可使用范圍方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
在Windows系統(tǒng)下管理多版本Python的工具實現(xiàn)方案
作為一名開發(fā)者,我的電腦上常年安裝著多個 Python 版本:2.7、3.7、3.8、3.9、3.10……每次需要切換時,要么手動修改系統(tǒng)環(huán)境變量?PATH,因此本文記錄了我從編寫 PowerShell 腳本、封裝成全局命令,到解決執(zhí)行策略限制的完整過程,需要的朋友可以參考下2026-03-03

