FastAPI Python: Hướng dẫn xây dựng REST API từ cơ bản

Giới thiệu về FastAPI Python

FastAPI Python: Hướng dẫn xây dựng REST API từ cơ bản

Khi xây dựng một ứng dụng AI, để cho nó thành một MVP, việc cung cấp một giao diện người dùng là cực kì cần thiết. Vậy cái gì đứng giữa BackEnd và FrontEnd? Đó chính là API. Trong Python nói chung và với cộng đồng AI nói riêng, FastAPI là một trong những framework đuợc sử dụng phổ biến cho công việc này. Trong bài viết này mình sẽ đi qua những kiến thức cơ bản của FastAPI, từ cách tạo API đầu tiên, Routing, nhận dữ liệu từ Request cho tới Validation với Pydantic. Mục tiêu là sau bài viết bạn có thể hiểu được cách FastAPI hoạt động và tự xây dựng một REST API đơn giản.

I. Cài đặt FastAPI

FastAPI hiện hỗ trợ cài đặt kèm các Dependency tiêu chuẩn thông qua: pip install "fastapi[standard]. Gói standard bao gồm các Dependency thường dùng, trong đó có Uvicorn và FastAPI CLI để chạy ứng dụng. Tiếp theo ta tạo file main.py

python
from fastapi import FastAPI 
app = FastAPI() 
@app.get("/") 
def root(): 
	return { 
		"message": "Hello FastAPI" 
	}

Sau đó chạy fastapi dev main.py. Server sẽ mặc định khởi chạy tại localhost:8000. Khi truy cập port trên ta nhận được "Hello FastAPI"

II. Swagger UI và API Documentation

Một tính năng rất tiện của FastAPI là tự động tạo Documentation từ những API chúng ta định nghĩa.

Sau khi chạy Server, truy cập:http://127.0.0.1:8000/docs , FastAPI sẽ cung cấp giao diện Swagger UI.

Ngoài ra còn có ReDoc tại:http://127.0.0.1:8000/redoc

FastAPI sinh các Documentation này dựa trên chuẩn OpenAPI, vì vậy khi thêm Endpoint, Parameter hoặc Schema mới, Documentation cũng được cập nhật theo.

Điểm hay của Swagger UI là chúng ta có thể gửi Request trực tiếp mà chưa cần Postman hay viết Frontend. Trong quá trình phát triển API nhỏ, /docs thường đã đủ để mình kiểm tra phần lớn Endpoint.

III. Routing trong FastAPI

Một REST API thường xoay quanh một số HTTP Method chính: GET, POST, PUSH, DELETE. FastAPI cung cấp Decorator tương ứng:

python
@app.get("/users")
 def get_users(): 
	pass 
@app.post("/users") 
def create_user(): 
	pass

Ngoài Method, một phần quan trọng khác là dữ liệu Client gửi vào API. Thông thường chúng ta sẽ gặp ba dạng chính: Path Parameter, Query Parameter và Request Body.

Path Parameter

Path Parameter là giá trị nằm trực tiếp bên trong URL.

Ví dụ: GET /users/10

Ta có thể lấy 10 bằng:

python
@app.get("/users/{user_id}")
def get_user(user_id: int):
    return {
        "user_id": user_id
    }

IV. Request Body và Pydantic

Đối với POST hoặc PUT, dữ liệu thường được gửi trong Request Body.

Ví dụ Client gửi:

json
{
    "name": "Minh",
    "age": 20
}

Đây là lúc Pydantic được sử dụng. Ta tạo một Schema bằng BaseModel:

python
from pydantic import BaseModel
class User(BaseModel):
    name: str
    age: int

Sau đó khai báo trực tiếp trong Endpoint:

python
@app.post("/users")
def create_user(user: User):
    return user

FastAPI hiểu rằng user là Request Body và dữ liệu phải tuân theo Schema User. Đây là một trong những lý do Type Hint đóng vai trò rất quan trọng trong FastAPI. Những khai báo kiểu vốn chủ yếu giúp Developer đọc Code và hỗ trợ IDE giờ còn được FastAPI sử dụng để Parse, Validate dữ liệu và tạo API Documentation.

Ta cũng có thể khai báo Field không bắt buộc, khi đó Request không có email vẫn hợp lệ.

python
class User(BaseModel):
    name: str
    age: int
 	email: str | None = None

V. Đồng bộ - Bất đồng bộ

Khi đọc FastAPI có thể sẽ thấy hai kiểu khai báo:

python
@app.get("/")
def root():
	
@app.get("/")
async def root

Không phải cứ sử dụng FastAPI thì tất cả Endpoint đều phải có async.

Nếu thư viện bạn sử dụng hỗ trợ await.Ngược lại, nếu thư viện đang sử dụng là Synchronous và không hỗ trợ await, bạn hoàn toàn có thể sử dụng def. Đây cũng là hướng dẫn được FastAPI đưa ra trong tài liệu về Concurrency.


Được chọn theo chủ đề và các khái niệm xuất hiện trong bài này.

Xem tất cả bài viết

Thảo luận bài viết

Câu hỏi, ghi chú và góc nhìn của bạn về nội dung này.

0 bình luận