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) | |
|---|---|---|
| ประกาศ route | app.get('/x', fn) | @app.get('/x') |
| รับ path param | req.params.id | product_id: int |
| รับ body | req.body | product: Product |
| ส่ง JSON | res.json(x) | return x |
| ตรวจข้อมูล | ต้องทำเอง | อัตโนมัติ (Pydantic) |
สรุป
| แนวคิด | สรุป |
|---|---|
FastAPI() | สร้างแอป |
@app.get/post/... | decorator กำหนด route |
Pydantic BaseModel | โครงสร้าง + ตรวจข้อมูลอัตโนมัติ |
uvicorn main:app --reload | รันเซิร์ฟเวอร์ |
/docs | เอกสาร API อัตโนมัติ |
บทหน้า: เก็บข้อมูลถาวรด้วย Database ใน Python 🗄️
อ่านจบแล้ว? ทำเครื่องหมายว่าเสร็จเพื่อบันทึกความคืบหน้า
แบบทดสอบ
ตอบให้ครบแล้วกด “ตรวจคำตอบ” เพื่อเช็คความเข้าใจ
1. FastAPI คืออะไร?
2. Decorator ใน Python เช่น @app.get('/x') ทำหน้าที่อะไร?
3. เครื่องมือที่ติดตั้งแพ็กเกจ Python ที่แนะนำในปัจจุบันคือ?
กำลังโหลด…