⏱️ ~13 นาที

FastAPI สร้าง REST API

สร้าง Backend API ที่เร็วและทันสมัยด้วย Python

FastAPI คืออะไร?

FastAPI เป็นเฟรมเวิร์ก Python สำหรับสร้าง REST API (ฝั่ง Backend) จุดเด่น:

  • เร็ว — เทียบได้กับ Node.js/Go
  • 📖 เขียนง่าย — ใช้ type hint ของ Python
  • 📚 มีเอกสารอัตโนมัติ — สร้างหน้า Swagger ให้เลย

💡 เปรียบเทียบ: ฝั่ง JS ใช้ Express → ฝั่ง Python ใช้ FastAPI

ทบทวน: REST API & HTTP method

Methodความหมาย
GETอ่าน/ดึงข้อมูล
POSTสร้างใหม่
PUT/PATCHแก้ไข
DELETEลบ

เตรียมเครื่องมือ: Virtual Environment

ธรรมเนียม Python คือสร้าง virtual environment (venv) แยกแพ็กเกจของแต่ละโปรเจกต์:

mkdir shop-api
cd shop-api
python -m venv venv

# เปิดใช้งาน
# macOS/Linux:
source venv/bin/activate
# Windows:
venv\Scripts\activate

เมื่อเห็น (venv) นำหน้า prompt แปลว่าเข้า venv แล้ว

ติดตั้ง FastAPI + เซิร์ฟเวอร์:

pip install fastapi "uvicorn[standard]"

API แรกของคุณ

สร้าง main.py:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "สวัสดีจาก FastAPI!"}

รัน:

uvicorn main:app --reload
  • main = ชื่อไฟล์ (ไม่มี .py)
  • app = ชื่อตัวแปรแอป
  • --reload = รีสตาร์ทอัตโนมัติเมื่อแก้โค้ด

เปิด http://localhost:8000 → เห็น JSON! และ http://localhost:8000/docs → เห็นเอกสาร API อัตโนมัติ! 🎉

Decorator คืออะไร?

บรรทัดที่ขึ้นต้นด้วย @ เรียกว่า decorator มัน "ตกแต่ง" ฟังก์ชันด้านล่าง:

@app.get("/products")     # เมื่อมี GET /products มา → เรียกฟังก์ชันนี้
def list_products():
    return [...]

สร้าง API CRUD ครบ

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

app = FastAPI()

# โครงสร้างข้อมูลที่รับเข้า (Pydantic ช่วยตรวจสอบให้อัตโนมัติ)
class Product(BaseModel):
    name: str
    price: float

# เก็บในหน่วยความจำ (บทหน้าจะใช้ database)
products = [
    {"id": 1, "name": "กาแฟ", "price": 80.0},
    {"id": 2, "name": "ชา", "price": 60.0}
]
next_id = 3

# GET /products — ดูทั้งหมด
@app.get("/products")
def list_products():
    return products

# GET /products/{id} — ดูอันเดียว
@app.get("/products/{product_id}")
def get_product(product_id: int):
    for p in products:
        if p["id"] == product_id:
            return p
    raise HTTPException(status_code=404, detail="ไม่พบสินค้า")

# POST /products — เพิ่มใหม่
@app.post("/products")
def create_product(product: Product):
    global next_id
    new_item = {"id": next_id, "name": product.name, "price": product.price}
    products.append(new_item)
    next_id += 1
    return new_item

# DELETE /products/{id} — ลบ
@app.delete("/products/{product_id}")
def delete_product(product_id: int):
    global products
    products = [p for p in products if p["id"] != product_id]
    return {"message": "ลบแล้ว"}

ลองรันแล้วเปิด http://localhost:8000/docs — ทดสอบ API ได้จากหน้าเว็บเลย!

Pydantic — ตรวจข้อมูลอัตโนมัติ

class Product(BaseModel):
    name: str        # ต้องเป็นข้อความ
    price: float     # ต้องเป็นตัวเลข

FastAPI ตรวจข้อมูลให้อัตโนมัติ:

  • ส่งผิดชนิด → ได้ error 422 พร้อมบอกว่าผิดตรงไหน
  • ไม่ต้องเขียนโค้ดตรวจเอง

Path Parameter vs Query Parameter

# Path: /products/5
@app.get("/products/{product_id}")
def get(product_id: int):
    ...

# Query: /products?limit=10&search=กาแฟ
@app.get("/products")
def list(limit: int = 10, search: str = ""):
    return {"limit": limit, "search": search}

CORS — ให้ Frontend เรียกได้

from fastapi.middleware.cors import CORSMiddleware

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],       # จริงจังควรระบุโดเมน
    allow_methods=["*"],
    allow_headers=["*"],
)

เปรียบเทียบกับ Express (JS)

Express (JS)FastAPI (Python)
ประกาศ routeapp.get('/x', fn)@app.get('/x')
รับ path paramreq.params.idproduct_id: int
รับ bodyreq.bodyproduct: Product
ส่ง JSONres.json(x)return x
ตรวจข้อมูลต้องทำเองอัตโนมัติ (Pydantic)

สรุป

แนวคิดสรุป
FastAPI()สร้างแอป
@app.get/post/...decorator กำหนด route
Pydantic BaseModelโครงสร้าง + ตรวจข้อมูลอัตโนมัติ
uvicorn main:app --reloadรันเซิร์ฟเวอร์
/docsเอกสาร API อัตโนมัติ

บทหน้า: เก็บข้อมูลถาวรด้วย Database ใน Python 🗄️

อ่านจบแล้ว? ทำเครื่องหมายว่าเสร็จเพื่อบันทึกความคืบหน้า

🧠

แบบทดสอบ

ตอบให้ครบแล้วกด “ตรวจคำตอบ” เพื่อเช็คความเข้าใจ

  1. 1. FastAPI คืออะไร?

  2. 2. Decorator ใน Python เช่น @app.get('/x') ทำหน้าที่อะไร?

  3. 3. เครื่องมือที่ติดตั้งแพ็กเกจ Python ที่แนะนำในปัจจุบันคือ?

กำลังโหลด…