๐ฆ ๅฎๆ่ฏไผฐ๏ผProject Toolkit/ๅ็ซฏๆกๆถ/FastAPI
FastAPI ๆถๆ่ฎพ่ฎก
FastAPI ๆฏๅบไบ Starlette + Pydantic ็็ฐไปฃ Python Web ๆกๆถ๏ผ็จ็ฑปๅๆ็คบ้ฉฑๅจ่ชๅจ้ช่ฏใๅบๅๅๅๆๆกฃ็ๆ๏ผasync-first ่ฎพ่ฎกไฝฟๅ ถๆไธบ Python ็ๆไธญๆง่ฝๆ้ซ็ API ๆกๆถใ
๐๏ธ ๆดไฝๆถๆ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Client Request โ
โ (HTTP / WebSocket) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ASGI Server (Uvicorn) โ
โ ๅผๆญฅไบไปถๅพช็ฏ (asyncio / uvloop) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ FastAPI (ๆ ธๅฟๅฑ) โ
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Starlette (Web ๅบ็กๅฑ) โ โ
โ โ โโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โ โ
โ โ โ Router โ โ Middlewareโ โ Request โ โ Response โ โ โ
โ โ โ ่ทฏ็ฑ โ โ ไธญ้ดไปถ โ โ ่ฏทๆฑ โ โ ๅๅบ โ โ โ
โ โ โโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โ โ
โ โ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ WebSocketโ โ Backgroundโ โ StaticFiles โ โ โ
โ โ โ โ โ Tasks โ โ Templates(Jinja2) โ โ โ
โ โ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ FastAPI ๆฉๅฑๅฑ โ โ
โ โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโ โ โ
โ โ โ Dependency โ โ Security โ โ APIRouter โ โ โ
โ โ โ Injection โ โ OAuth2/JWT โ โ ่ทฏ็ฑๅ็ป โ โ โ
โ โ โ ไพ่ตๆณจๅ
ฅ โ โ ๅฎๅ
จ โ โ โ โ โ
โ โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโ โ โ
โ โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโ โ โ
โ โ โ OpenAPI โ โ CORS โ โ Exception โ โ โ
โ โ โ ่ชๅจ็ๆๆๆกฃ โ โ ่ทจๅ โ โ Handler โ โ โ
โ โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Pydantic (ๆฐๆฎๅฑ) โ โ
โ โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโ โ โ
โ โ โ BaseModel โ โ Validators โ โ Serialization โ โ โ
โ โ โ ๆฐๆฎๆจกๅ โ โ ้ช่ฏๅจ โ โ ๅบๅๅ โ โ โ
โ โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
๐ ๆ ธๅฟ่ฎพ่ฎกๆๆณ
1. ็ฑปๅๆ็คบ้ฉฑๅจไธๅ
FastAPI ็ๆ ธๅฟๅๆฐๆฏๅฉ็จ Python ๅ็็ฑปๅๆ็คบ๏ผType Hints๏ผๅๆถๅฎ็ฐ๏ผ
- ่ฏทๆฑ้ช่ฏ๏ผ่ชๅจๆ ก้ช่ทฏๅพๅๆฐใๆฅ่ฏขๅๆฐใ่ฏทๆฑไฝ
- ๅบๅๅ๏ผ่ชๅจๅฐ Python ๅฏน่ฑก่ฝฌไธบ JSON
- ๆๆกฃ็ๆ๏ผ่ชๅจไป็ฑปๅไฟกๆฏ็ๆ OpenAPI/Swagger ๆๆกฃ
- IDE ๆฏๆ๏ผ่ชๅจ่กฅๅ จใ็ฑปๅๆฃๆฅ
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
is_offer: bool = False
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):
# item_id: int โ ่ทฏๅพๅๆฐ่ชๅจ่ฝฌ int๏ผ้ๆฐๅญ่ฟๅ 422
# item: Item โ ่ฏทๆฑไฝ่ชๅจ็จ Pydantic ้ช่ฏ๏ผไธๅๆณ่ฟๅ 422
return {"item_name": item.name, "item_id": item_id}
่ฎพ่ฎกๅฒๅญฆ๏ผไธไธช็ฑปๅๅฃฐๆ๏ผไธ้ๆถ็๏ผ้ช่ฏ + ๅบๅๅ + ๆๆกฃ๏ผใ่ฟไธๆฏ้ญๆณ๏ผๆฏๅฏน Python ็ฑปๅ็ณป็ป็ๆทฑๅบฆๅฉ็จใ
2. ASGI ๅผๆญฅๅ็
FastAPI ๅบไบ ASGI๏ผAsynchronous Server Gateway Interface๏ผ๏ผๅ็ๆฏๆ async/await๏ผ
ไผ ็ป WSGI ๆกๆถ (Flask/Django) ASGI ๆกๆถ (FastAPI)
โโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโ
โ ่ฏทๆฑ1 โ ๅค็ โ ๅๅบ โ โ ่ฏทๆฑ1 โโ โ
โ ่ฏทๆฑ2 โ ็ญๅพ
... โ โ ่ฏทๆฑ2 โโผโ ๅนถๅๅค็ โ
โ ่ฏทๆฑ3 โ ็ญๅพ
... โ โ ่ฏทๆฑ3 โโ โ
โ (ๅๆญฅ้ปๅก) โ โ (ๅผๆญฅ้้ปๅก) โ
โโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโ
| ๆกๆถ | ๆจกๅ | ๅนถๅๆนๅผ | ๆฏ็ง่ฏทๆฑๆฐ |
|---|---|---|---|
| Flask (Gunicorn) | WSGI | ๅค่ฟ็จ/ๅค็บฟ็จ | ~2,650 |
| Django REST (Gunicorn) | WSGI | ๅค่ฟ็จ/ๅค็บฟ็จ | ~4,000-5,000 |
| FastAPI (Uvicorn) | ASGI | ๅผๆญฅไบไปถๅพช็ฏ | ~15,000-20,000 |
ๅ ณ้ฎ็น๏ผไธไธช FastAPI worker ๅค็ I/O ๅนถๅ็่ฝๅ็ธๅฝไบ 8-10 ไธช Django workerใ
3. ไพ่ตๆณจๅ ฅ็ณป็ป
FastAPI ๅ ็ฝฎไบๅผบๅคง็ไพ่ตๆณจๅ ฅ๏ผDependency Injection๏ผ็ณป็ป๏ผๆฏๅ ถๆถๆ็ๆ ธๅฟๆฏๆฑ๏ผ
# ไพ่ตๅฝๆฐ๏ผๅฏไปฅๆฏๆฎ้ๅฝๆฐๆ async ๅฝๆฐ
async def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
async def get_current_user(token: str = Depends(oauth2_scheme)):
user = decode_token(token)
if not user:
raise HTTPException(status_code=401)
return user
# ่ทฏ็ฑๅฝๆฐๅฃฐๆไพ่ต๏ผFastAPI ่ชๅจๆณจๅ
ฅ
@app.get("/users/me")
async def read_users_me(
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db)
):
return current_user
ไพ่ตๆณจๅ ฅ็็จ้๏ผ
- ๆฐๆฎๅบ่ฟๆฅ็ฎก็
- ่ฎค่ฏๅๆๆ
- ้ ็ฝฎๆณจๅ ฅ
- ่ฏทๆฑๅๆฐๅค็จ
- ๆๅกๅฑๆฝ่ฑก
4. ไธญ้ดไปถ็ฎก้
Request โ [CORS] โ [GZip] โ [่ฎค่ฏ] โ [ๆฅๅฟ] โ Router โ Response
โ
Response โ [CORS] โ [GZip] โ [ๅค็] โ [ๆฅๅฟ] โโโโโ
@app.middleware("http")
async def add_process_time_header(request: 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
๐งฉ ๆ ธๅฟ็ปไปถ
Starlette โ Web ๅบ็กๅฑ
FastAPI ๅฎๅ จๆๅปบๅจ Starlette ไนไธ๏ผ็ปงๆฟๅ ถๆๆ่ฝๅ๏ผ
| ่ฝๅ | ่ฏดๆ |
|---|---|
| ASGI ่ทฏ็ฑ | ้ซๆง่ฝ่ทฏ็ฑๅน้ |
| ่ฏทๆฑ/ๅๅบ | HTTP ๅ WebSocket |
| ไธญ้ดไปถ | CORSใGZipใHTTPS Redirect ็ญ |
| ๅๅฐไปปๅก | BackgroundTasks |
| ้ๆๆไปถ | StaticFiles |
| ๆจกๆฟ | Jinja2 ๆจกๆฟๆธฒๆ |
| WebSocket | ๅ็ WebSocket ๆฏๆ |
Pydantic โ ๆฐๆฎ้ช่ฏๅฑ
from pydantic import BaseModel, Field, validator
from datetime import datetime
from typing import Optional
class UserCreate(BaseModel):
username: str = Field(..., min_length=3, max_length=50)
email: str = Field(..., pattern=r'^[\w\.-]+@[\w\.-]+\.\w+$')
age: int = Field(..., gt=0, le=150)
created_at: datetime = Field(default_factory=datetime.now)
@validator('username')
def username_alphanumeric(cls, v):
if not v.isalnum():
raise ValueError('็จๆทๅๅฟ
้กปๆฏๅญๆฏๆฐๅญ')
return v
Pydantic v2 ๅๅ๏ผ2026 ๅนด FastAPI ๆไฝ่ฆๆฑ Pydantic 2.7+๏ผ๏ผ
- ๆ ธๅฟ็จ Rust ๅฎ็ฐ๏ผ้ช่ฏ้ๅบฆๆๅ 5-50 ๅ
@validatorโ@field_validatorConfig็ฑป โmodel_config
่ทฏ็ฑ็ณป็ป
from fastapi import APIRouter
# ่ทฏ็ฑๅ็ป
router = APIRouter(
prefix="/api/v1/users",
tags=["users"],
responses={404: {"description": "Not found"}}
)
@router.get("/")
async def list_users():
...
@router.get("/{user_id}")
async def get_user(user_id: int):
...
# ๅจไธปๅบ็จไธญๆณจๅ
app.include_router(router)
ๅฎๅ จ็ณป็ป
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from fastapi import Depends, HTTPException, status
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
# OAuth2 ๅฏ็ ๆต
@app.post("/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
user = authenticate_user(form_data.username, form_data.password)
if not user:
raise HTTPException(status_code=401)
access_token = create_access_token(data={"sub": user.username})
return {"access_token": access_token, "token_type": "bearer"}
# ๅไฟๆค็่ทฏ็ฑ
@app.get("/protected")
async def protected_route(token: str = Depends(oauth2_scheme)):
payload = verify_token(token)
return {"user": payload["sub"]}
๐ ่ฏทๆฑๅค็ๆต็จ
1. ๅฎขๆท็ซฏๅ้ HTTP ่ฏทๆฑ
โ
2. Uvicorn (ASGI Server) ๆฅๆถ
โ
3. ไธญ้ดไปถ้พๅค็๏ผCORSใGZipใ่ชๅฎไนไธญ้ดไปถ๏ผ
โ
4. ่ทฏ็ฑๅน้
๏ผRouter ๆ นๆฎ method + path ๆพๅฐๅฏนๅบๅฝๆฐ๏ผ
โ
5. ไพ่ตๆณจๅ
ฅ่งฃๆ๏ผDepends() ้ๅฝ่งฃๆๆๆไพ่ต๏ผ
โ
6. ๅๆฐ้ช่ฏ๏ผPydantic ้ช่ฏ่ทฏๅพๅๆฐใๆฅ่ฏขๅๆฐใ่ฏทๆฑไฝ๏ผ
โ - ้ช่ฏๅคฑ่ดฅ โ ่ฟๅ 422 Unprocessable Entity
โ
7. ๆง่ก่ทฏ็ฑๅฝๆฐ
โ - ๆๅบ HTTPException โ ่ฟๅๅฏนๅบ็ถๆ็
โ - ๆๅบๅ
ถไปๅผๅธธ โ ่ฟๅ 500
โ
8. ๅๅบๅบๅๅ๏ผPydantic response_model ่ชๅจๅบๅๅ่พๅบ๏ผ
โ
9. ไธญ้ดไปถ้พๅๅๅค็
โ
10. Uvicorn ๅ้ HTTP ๅๅบ
๐ ไธ Flask/Django ๆถๆๅฏนๆฏ
| ็ปดๅบฆ | FastAPI | Flask | Django |
|---|---|---|---|
| ๅ่ฎฎ | ASGI๏ผๅผๆญฅ๏ผ | WSGI๏ผๅๆญฅ๏ผ | WSGI๏ผๅๆญฅ๏ผ/ ASGI๏ผ6.0+๏ผ |
| ๅผๆญฅๆฏๆ | ๅ็ async/await | ้ๆฉๅฑ | Django 6.0 ๅผๅงๆฏๆ |
| ๆฐๆฎ้ช่ฏ | Pydantic๏ผ่ชๅจ๏ผ | ๆๅจๆๆฉๅฑ | Serializer๏ผๆๅจ๏ผ |
| ๆๆกฃ็ๆ | ่ชๅจ OpenAPI/Swagger | ้ๆฉๅฑ | ้ DRF + drf-yasg |
| ไพ่ตๆณจๅ ฅ | ๅ ็ฝฎ | ๆ ๏ผ้ๆฉๅฑ๏ผ | ๆ ๏ผ้ ไธญ้ดไปถ๏ผ |
| ORM | ๆ ๏ผๅฏ้ SQLAlchemy๏ผ | ๆ ๏ผๅฏ้๏ผ | ๅ ็ฝฎ Django ORM |
| Admin ้ขๆฟ | ๆ | ๆ | ๅ ็ฝฎ |
| ่ฎค่ฏ็ณป็ป | ๅ ็ฝฎ OAuth2/JWT ๅทฅๅ ท | ้ๆฉๅฑ | ๅ ็ฝฎ |
| WebSocket | ๅ็ๆฏๆ๏ผStarlette๏ผ | ้ๆฉๅฑ | Django Channels |
| ๆจกๆฟๅผๆ | Jinja2๏ผๅฏ้๏ผ | Jinja2 | Django Template |
| ๅญฆไน ๆฒ็บฟ | ไฝ-ไธญ | ไฝ | ไธญ-้ซ |
๐ ็ธๅ ณ้พๆฅ
- Python Starlette Pydantic ASGI REST API ๅพฎๆๅก
- FastAPI ๅฎๆนๆๆกฃ
- Starlette ๆๆกฃ
- Pydantic ๆๆกฃ
- TechEmpower Benchmarks
๐ ไธชไบบๅคๆณจ
๏ผ็็ฝ๏ผไพๅ็ปญ่กฅๅ ๅญฆไน ๅฟๅพ๏ผ