FastAPI là một framework web hiện đại, hiệu năng cao để xây dựng API với Python 3.7+ dựa trên các type hint tiêu chuẩn của Python. Nó được xây dựng trên nền tảng Starlette (cho phần web) và Pydantic (cho phần dữ liệu). FastAPI được thiết kế để dễ sử dụng và mang lại hiệu suất cao, khiến nó trở thành lựa chọn phổ biến cho các nhà phát triển muốn xây dựng RESTful API nhanh chóng và hiệu quả.
Trong bài viết này, chúng ta sẽ tìm hiểu các tính năng cốt lõi của FastAPI, thực hành cách xây dựng một REST API đơn giản và khám phá một số chức năng nâng cao. Sau khi đọc xong, bạn sẽ nắm vững cách tận dụng FastAPI để tạo ra các API mạnh mẽ và dễ mở rộng.
Bắt đầu với FastAPI
Để bắt đầu sử dụng FastAPI, trước tiên bạn cần cài đặt nó. FastAPI cũng yêu cầu một ASGI server, chẳng hạn như Uvicorn, để chạy ứng dụng của bạn. Bạn có thể cài đặt cả hai bằng pip:
pip install fastapi uvicorn
Sau khi cài đặt, bạn có thể tạo một ứng dụng FastAPI đơn giản. Hãy tạo một API “Hello, World!” cơ bản:
from fastapi import FastAPI app = FastAPI() @app.get("/")
async def read_root(): return {"Hello": "World"}
Giải thích:
- Đối tượng FastAPI: Chúng ta tạo một instance của lớp FastAPI. Đây sẽ là điểm vào chính của ứng dụng.
- Trình trang trí (Decorator) định nghĩa đường dẫn: @app.get("/") định nghĩa một endpoint xử lý yêu cầu GET gửi đến URL gốc (/).
- Hàm bất đồng bộ: async def read_root khai báo một endpoint bất đồng bộ. Đây là tính năng quan trọng của FastAPI cho phép xử lý không chặn.
Định nghĩa các Endpoint API
FastAPI cho phép bạn dễ dàng định nghĩa các phương thức HTTP khác nhau và endpoint với rất ít công sức. Hãy xây dựng một API phức tạp hơn để quản lý các mặt hàng trong kho.
from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional app = FastAPI() class Item(BaseModel): name: str description: Optional[str] = None price: float tax: Optional[float] = None @app.post("/items/")
async def create_item(item: Item): return item @app.get("/items/{item_id}")
async def read_item(item_id: int, q: Optional[str] = None): return {"item_id": item_id, "q": q}
Giải thích:
- Model dữ liệu: Chúng ta định nghĩa lớp
Item
dựa trênBaseModel
của Pydantic. Model này sẽ dùng để kiểm tra và tuần tự hóa (serialize) payload JSON. - Endpoint POST:
@app.post("/items/")
định nghĩa một endpoint POST để tạo mới item. Nó nhận một đối tượng Item và trả lại nó trong phản hồi. - Endpoint GET:
@app.get("/items/{item_id}")
định nghĩa endpoint GET để lấy thông tin một item theo ID. Nó cũng hỗ trợ tham số query tùy chọnq
.
Các tính năng nâng cao
FastAPI cung cấp nhiều tính năng nâng cao như dependency injection, background tasks, và middleware. Hãy tìm hiểu cách sử dụng dependency để xác thực người dùng.
from fastapi import Depends, FastAPI, HTTPException, Security
from fastapi.security import OAuth2PasswordBearer app = FastAPI() oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") async def get_current_user(token: str = Depends(oauth2_scheme)): if token != "fake-super-secret-token": raise HTTPException(status_code=401, detail="Invalid authentication credentials") return {"username": "john_doe"} @app.get("/users/me")
async def read_users_me(current_user: dict = Depends(get_current_user)): return current_user
Giải thích:
- OAuth2 Password Flow: Sử dụng
OAuth2PasswordBearer
để khai báo schema bảo mật yêu cầu token để xác thực. - Dependency Injection: Hàm
Depends
được dùng để khai báo dependency. Ở đây,get_current_user
là dependency của endpoint/users/me
. - Logic xác thực: Trong
get_current_user
, token được kiểm tra. Nếu token không hợp lệ, một ngoại lệ HTTP được ném ra.
Kết luận
FastAPI là một framework hiện đại, mạnh mẽ, giúp các nhà phát triển xây dựng API hiệu năng cao và đáng tin cậy với lượng mã nguồn tối thiểu. Tính dễ sử dụng, khả năng tự động kiểm tra dữ liệu và tài liệu tương tác khiến nó trở thành lựa chọn tuyệt vời cho cả người mới bắt đầu lẫn các lập trình viên giàu kinh nghiệm.
Bằng cách tận dụng các tính năng của FastAPI, bạn có thể tập trung phát triển logic cốt lõi của ứng dụng, trong khi framework sẽ giúp bạn xử lý hầu hết các vấn đề thường gặp.
Dù bạn đang xây dựng một microservice đơn giản hay một API phức tạp, FastAPI đều cung cấp công cụ và sự linh hoạt cần thiết để thành công.