MD ๅˆ†็ฑป๏ผšๅŽ็ซฏๆก†ๆžถ ๆ›ดๆ–ฐ๏ผš2026/5/12

๐Ÿ“ฆ ๅฎžๆˆ˜่ฏ„ไผฐ๏ผš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_validator
  • Config ็ฑป โ†’ 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 ๆžถๆž„ๅฏนๆฏ”

็ปดๅบฆFastAPIFlaskDjango
ๅ่ฎฎ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๏ผˆๅฏ้€‰๏ผ‰Jinja2Django Template
ๅญฆไน ๆ›ฒ็บฟไฝŽ-ไธญไฝŽไธญ-้ซ˜

๐Ÿ”— ็›ธๅ…ณ้“พๆŽฅ

๐Ÿ“ ไธชไบบๅค‡ๆณจ

๏ผˆ็•™็™ฝ๏ผŒไพ›ๅŽ็ปญ่กฅๅ……ๅญฆไน ๅฟƒๅพ—๏ผ‰