简介:本文详细介绍如何使用Python的FastAPI框架与PostgreSQL数据库构建一个完整的RESTful API,涵盖环境配置、数据库连接、CRUD操作及安全认证等核心环节,适合开发者快速掌握现代Web服务开发技能。
在微服务架构盛行的今天,开发者需要快速构建高性能、易维护的API服务。FastAPI凭借其基于类型注解的自动文档生成、异步支持和高性能特性,成为Python生态中最受欢迎的Web框架之一。结合PostgreSQL这一功能强大的开源关系型数据库,开发者可以构建出既高效又可靠的后端服务。本文将通过一个完整的示例,展示如何使用这两个技术栈构建一个简单的API服务。
构建FastAPI应用需要Python 3.7+环境。建议使用虚拟环境管理依赖:
python -m venv api_envsource api_env/bin/activate # Linux/Mac# 或 api_env\Scripts\activate (Windows)pip install fastapi uvicorn[standard] asyncpg databases sqlalchemy
推荐采用分层架构设计:
project/├── app/│ ├── main.py # 入口文件│ ├── models.py # 数据模型│ ├── schemas.py # 数据验证│ ├── crud.py # 数据操作│ └── database.py # 数据库连接├── requirements.txt└── .env # 环境变量
使用asyncpg和databases库实现异步连接:
# database.pyfrom databases import Databasefrom sqlalchemy import create_engine, MetaDataDATABASE_URL = "postgresql://user:password@localhost/dbname"database = Database(DATABASE_URL)metadata = MetaData()async def init_db():engine = create_engine(DATABASE_URL)metadata.create_all(engine)
使用SQLAlchemy Core定义表结构:
# models.pyfrom sqlalchemy import Table, Column, Integer, String, DateTimefrom sqlalchemy.sql import funcfrom .database import metadatausers = Table("users",metadata,Column("id", Integer, primary_key=True),Column("name", String(50)),Column("email", String(100), unique=True),Column("created_at", DateTime(timezone=True), server_default=func.now()))
# main.pyfrom fastapi import FastAPIfrom .database import database, init_dbfrom .routers import user_routerapp = FastAPI()@app.on_event("startup")async def startup():await database.connect()await init_db()@app.on_event("shutdown")async def shutdown():await database.disconnect()app.include_router(user_router.router)
使用Pydantic进行请求/响应验证:
# schemas.pyfrom pydantic import BaseModel, EmailStrfrom datetime import datetimeclass UserCreate(BaseModel):name: stremail: EmailStrclass User(BaseModel):id: intname: stremail: EmailStrcreated_at: datetimeclass Config:orm_mode = True
# crud.pyfrom .models import usersfrom .schemas import UserCreate, Userfrom .database import databaseasync def create_user(user: UserCreate):query = users.insert().values(name=user.name,email=user.email)user_id = await database.execute(query)return {"id": user_id, **user.dict()}async def get_user(user_id: int):query = users.select().where(users.c.id == user_id)return await database.fetch_one(query)
# routers/user_router.pyfrom fastapi import APIRouter, HTTPExceptionfrom ..schemas import UserCreate, Userfrom ..crud import create_user, get_userrouter = APIRouter(prefix="/users", tags=["users"])@router.post("/", response_model=User)async def create_new_user(user: UserCreate):db_user = await create_user(user)return db_user@router.get("/{user_id}", response_model=User)async def read_user(user_id: int):db_user = await get_user(user_id)if db_user is None:raise HTTPException(status_code=404, detail="User not found")return db_user
# dependencies.pyfrom fastapi import Depends, HTTPExceptionfrom fastapi.security import OAuth2PasswordBearerfrom jose import JWTError, jwtfrom datetime import datetime, timedeltaSECRET_KEY = "your-secret-key"ALGORITHM = "HS256"ACCESS_TOKEN_EXPIRE_MINUTES = 30oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")def verify_token(token: str = Depends(oauth2_scheme)):try:payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])return payloadexcept JWTError:raise HTTPException(status_code=401, detail="Invalid token")
FastAPI自动生成Swagger UI和OpenAPI规范:
# main.py 添加以下内容app = FastAPI(title="User Management API",description="API for managing users",version="1.0.0",openapi_url="/openapi.json")
使用Gunicorn + Uvicorn Worker:
gunicorn -k uvicorn.workers.UvicornWorker -w 4 -b 0.0.0.0:8000 main:app
# database.py 修改database = Database(DATABASE_URL,min_size=5,max_size=20,max_queries=50000)
uvicorn app.main:app --reload
使用curl或HTTP客户端测试:
# 创建用户curl -X POST "http://127.0.0.1:8000/users/" \-H "Content-Type: application/json" \-d '{"name":"John Doe","email":"john@example.com"}'# 获取用户curl "http://127.0.0.1:8000/users/1"
通过本文的指导,开发者可以快速构建一个基于FastAPI和PostgreSQL的高性能API服务。这个组合不仅适合快速原型开发,也能支撑生产环境的高并发需求。随着项目规模的扩大,可以逐步添加更多高级功能,如缓存层、分布式追踪等,构建出企业级的微服务架构。