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

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

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

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

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

FastAPI通過(guò)使用類型提示來(lái)定義路徑參數(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定義為一個(gè)整數(shù)。FastAPI會(huì)自動(dòng)驗(yàn)證傳遞的參數(shù)是否為整數(shù),并在不匹配時(shí)返回一個(gè)400錯(cuò)誤響應(yīng)。
查詢參數(shù)
除了路徑參數(shù),F(xiàn)astAPI還支持查詢參數(shù)。它們是定義在URL路徑之后的可選參數(shù),通常用于過(guò)濾和分頁(yè):
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。
請(qǐng)求體

FastAPI支持請(qǐng)求體數(shù)據(jù)的聲明和驗(yàn)證。通常,POST、PUT等請(qǐng)求會(huì)需要一個(gè)請(qǐng)求體:
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模型來(lái)定義請(qǐng)求體的結(jié)構(gòu)和類型。FastAPI會(huì)驗(yàn)證和解析請(qǐng)求體中的數(shù)據(jù),并將其作為參數(shù)傳遞給路徑操作函數(shù)。
數(shù)據(jù)驗(yàn)證和自動(dòng)文檔
FastAPI利用Pydantic進(jìn)行數(shù)據(jù)驗(yàn)證,并自動(dòng)生成API文檔。當(dāng)你運(yùn)行FastAPI應(yīng)用時(shí),它會(huì)生成兩個(gè)API文檔界面,分別是Swagger UI和ReDoc。

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

中間件是一個(gè)能夠在請(qǐng)求或響應(yīng)期間處理數(shù)據(jù)的函數(shù)。FastAPI提供簡(jiǎn)單的方式來(lái)編寫中間件,這有助于在應(yīng)用中引入額外的功能,例如請(qǐng)求/響應(yīng)日志、CORS處理、安全措施等。
下面是一個(gè)簡(jiǎn)單的中間件示例,用于記錄請(qǐng)求時(shí)間:
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)用開(kāi)發(fā)中,CORS是一個(gè)常見(jiàn)的問(wèn)題。FastAPI提供了一種簡(jiǎn)單的方式來(lái)處理CORS問(wèn)題,你可以通過(guò)安裝starlette.middleware.cors.CORSMiddleware來(lái)實(shí)現(xiàn):
from fastapi import FastAPI
from starlette.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 允許訪問(wèn)的源
allow_credentials=True,
allow_methods=["*"], # 允許的HTTP方法
allow_headers=["*"], # 允許的HTTP表頭
)通過(guò)以上配置,你可以實(shí)現(xiàn)從不同源的客戶端訪問(wèn)FastAPI應(yīng)用。你可以根據(jù)實(shí)際需求調(diào)整允許的來(lái)源、方法和表頭。
數(shù)據(jù)庫(kù)集成

FastAPI是一個(gè)輕量級(jí)框架,可以很容易地與多種數(shù)據(jù)庫(kù)集成。在構(gòu)建生產(chǎn)級(jí)應(yīng)用時(shí),數(shù)據(jù)庫(kù)是必不可少的一部分。其中SQLAlchemy是Python中常用的ORM框架,我們可以利用它與FastAPI進(jìn)行集成:
首先,安裝SQLAlchemy和數(shù)據(jù)庫(kù)驅(qū)動(dòng):
pip install sqlalchemy pip install databases
接下來(lái),定義數(shù)據(jù)庫(kù)配置和模型:
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ù)庫(kù)會(huì)話和路徑操作:
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在上面的代碼中,我們定義了一個(gè)SQLAlchemy數(shù)據(jù)庫(kù)模型,同時(shí)創(chuàng)建了CRUD操作,包括創(chuàng)建(POST)和讀?。℅ET)功能。通過(guò)Depends依賴注入,我們將數(shù)據(jù)庫(kù)會(huì)話傳遞給路徑操作函數(shù),使我們能夠輕松管理數(shù)據(jù)庫(kù)事務(wù)。
全面總結(jié)
FastAPI是一個(gè)強(qiáng)大且高效的Web框架,適合從小型項(xiàng)目到大型企業(yè)級(jí)應(yīng)用的各種開(kāi)發(fā)需求。因?yàn)樗淖詣?dòng)文檔、數(shù)據(jù)驗(yàn)證和優(yōu)秀的性能,F(xiàn)astAPI在編寫現(xiàn)代Web服務(wù)時(shí)提供了巨大的便捷性。結(jié)合異步、CORS、中間件和數(shù)據(jù)庫(kù)集成功能,F(xiàn)astAPI能夠幫助開(kāi)發(fā)者快速構(gòu)建穩(wěn)健的API服務(wù)。我們強(qiáng)烈推薦在你的下一個(gè)項(xiàng)目中試用FastAPI,并享受其帶來(lái)的高效開(kāi)發(fā)體驗(yàn)。
到此這篇關(guān)于Python 框架 FastAPI的文章就介紹到這了,更多相關(guān)Python 框架 FastAPI內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python多線程編程(八):使用Event實(shí)現(xiàn)線程間通信
這篇文章主要介紹了Python多線程編程(八):使用Event實(shí)現(xiàn)線程間通信,,需要的朋友可以參考下2015-04-04
擴(kuò)展Django admin的list_filter()可使用范圍方法
今天小編就為大家分享一篇擴(kuò)展Django admin的list_filter()可使用范圍方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
基于python和pygame庫(kù)實(shí)現(xiàn)刮刮樂(lè)游戲
這篇文章主要介紹了如何基于python和pygame庫(kù)實(shí)現(xiàn)刮刮樂(lè)游戲,文中通過(guò)代碼示例和圖文給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-03-03
在Windows系統(tǒng)下管理多版本Python的工具實(shí)現(xiàn)方案
作為一名開(kāi)發(fā)者,我的電腦上常年安裝著多個(gè) Python 版本:2.7、3.7、3.8、3.9、3.10……每次需要切換時(shí),要么手動(dòng)修改系統(tǒng)環(huán)境變量?PATH,因此本文記錄了我從編寫 PowerShell 腳本、封裝成全局命令,到解決執(zhí)行策略限制的完整過(guò)程,需要的朋友可以參考下2026-03-03
python如何生成網(wǎng)頁(yè)驗(yàn)證碼
這篇文章主要為大家詳細(xì)介紹了python如何生成網(wǎng)頁(yè)驗(yàn)證碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07

