FastAPI 入门教程FastAPI 入门教程
首页
基础教程
实战项目
FastAPI官网
首页
基础教程
实战项目
FastAPI官网
  • 实战项目

    • 🎯 实战项目 - 学生管理系统
    • 第1章 - 项目概述
    • 第2章 - 项目搭建
    • 第3章 - 数据模型
    • 第4章 - CRUD 接口
    • 第5章 - 进阶功能
    • 第6章 - 完整代码

第2章 - 项目搭建

🎯 本章目标

  • 创建项目目录结构
  • 配置数据库连接
  • 创建基础文件
  • 运行项目

1️⃣ 创建项目目录

# 创建项目目录
mkdir student-management
cd student-management

# 创建子目录
mkdir -p app/models app/schemas app/crud app/api app/utils

2️⃣ 创建虚拟环境

# 创建虚拟环境
python -m venv venv

# 激活虚拟环境
# Windows:
venv\Scripts\activate
# Mac/Linux:
source venv/bin/activate

3️⃣ 安装依赖

创建 requirements.txt:

fastapi==0.104.1
uvicorn==0.24.0
sqlalchemy==2.0.23
pydantic==2.5.2
python-multipart==0.0.6

安装依赖:

pip install -r requirements.txt

4️⃣ 配置文件

app/config.py

"""
项目配置文件
"""

class Settings:
    # 项目信息
    PROJECT_NAME: str = "学生管理系统"
    PROJECT_VERSION: str = "1.0.0"
    PROJECT_DESCRIPTION: str = "一个基于 FastAPI 的学生管理系统"
    
    # 数据库配置
    DATABASE_URL: str = "sqlite:///./student.db"
    
    # 如果使用 MySQL,配置如下:
    # DATABASE_URL: str = "mysql+pymysql://user:password@localhost:3306/student_db"
    
    # API 前缀
    API_PREFIX: str = "/api"

settings = Settings()

app/database.py

"""
数据库配置
"""
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

from app.config import settings

# 创建数据库引擎
engine = create_engine(
    settings.DATABASE_URL,
    connect_args={"check_same_thread": False}  # SQLite 需要
)

# 创建会话工厂
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# 创建基类
Base = declarative_base()

def get_db():
    """获取数据库会话"""
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

5️⃣ 通用响应模型

app/utils/response.py

"""
统一响应模型
"""
from typing import Generic, TypeVar, Optional, List
from pydantic import BaseModel

T = TypeVar('T')

class ResponseModel(BaseModel, Generic[T]):
    """通用响应模型"""
    code: int = 200
    message: str = "success"
    data: Optional[T] = None

class PageData(BaseModel, Generic[T]):
    """分页数据模型"""
    items: List[T]
    total: int
    page: int
    size: int
    pages: int

def success(data=None, message: str = "success"):
    """成功响应"""
    return ResponseModel(code=200, message=message, data=data)

def error(code: int = 400, message: str = "error"):
    """错误响应"""
    return ResponseModel(code=code, message=message, data=None)

def page_response(items: list, total: int, page: int, size: int):
    """分页响应"""
    pages = (total + size - 1) // size  # 计算总页数
    return ResponseModel(
        code=200,
        message="success",
        data=PageData(
            items=items,
            total=total,
            page=page,
            size=size,
            pages=pages
        )
    )

6️⃣ 创建 init.py 文件

为每个包创建空的 __init__.py 文件:

# Windows PowerShell
New-Item -ItemType File -Path app/__init__.py
New-Item -ItemType File -Path app/models/__init__.py
New-Item -ItemType File -Path app/schemas/__init__.py
New-Item -ItemType File -Path app/crud/__init__.py
New-Item -ItemType File -Path app/api/__init__.py
New-Item -ItemType File -Path app/utils/__init__.py

或者手动创建这些空文件。

7️⃣ 主程序入口

app/main.py

"""
主程序入口
"""
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

from app.config import settings
from app.database import engine, Base

# 创建数据库表(后面会添加模型后生效)
Base.metadata.create_all(bind=engine)

# ��建 FastAPI 应用
app = FastAPI(
    title=settings.PROJECT_NAME,
    description=settings.PROJECT_DESCRIPTION,
    version=settings.PROJECT_VERSION,
    docs_url="/docs",
    redoc_url="/redoc"
)

# 配置 CORS(跨域)
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # 生产环境应该设置具体的域名
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# 根路由
@app.get("/")
def root():
    return {
        "message": "欢迎使用学生管理系统",
        "docs": "/docs",
        "redoc": "/redoc"
    }

# 健康检查
@app.get("/health")
def health_check():
    return {"status": "healthy"}

# 后面会在这里注册路由
# from app.api import students, classes, scores, statistics
# app.include_router(students.router, prefix=settings.API_PREFIX, tags=["学生管理"])
# app.include_router(classes.router, prefix=settings.API_PREFIX, tags=["班级管理"])
# app.include_router(scores.router, prefix=settings.API_PREFIX, tags=["成绩管理"])
# app.include_router(statistics.router, prefix=settings.API_PREFIX, tags=["数据统计"])

8️⃣ 项目结构确认

现在的项目结构应该是这样的:

student-management/
├── app/
│   ├── __init__.py
│   ├── main.py
│   ├── config.py
│   ├── database.py
│   ├── models/
│   │   └── __init__.py
│   ├── schemas/
│   │   └── __init__.py
│   ├── crud/
│   │   └── __init__.py
│   ├── api/
│   │   └── __init__.py
│   └── utils/
│       ├── __init__.py
│       └── response.py
├── venv/
├── requirements.txt
└── README.md

9️⃣ 运行项目

# 在项目根目录运行
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

看到以下输出说明成功:

INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [xxxxx]
INFO:     Started server process [xxxxx]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

🔟 测试访问

打开浏览器访问:

  • http://127.0.0.1:8000 - 首页
  • http://127.0.0.1:8000/docs - Swagger UI 文档
  • http://127.0.0.1:8000/redoc - ReDoc 文档
  • http://127.0.0.1:8000/health - 健康检查

📝 小结

本章我们完成了:

  1. ✅ 创建项目目录结构
  2. ✅ 配置虚拟环境和依赖
  3. ✅ 创建配置文件
  4. ✅ 配置数据库连接
  5. ✅ 创建通用响应模型
  6. ✅ 创建主程序入口
  7. ✅ 成功运行项目

🏃 下一步

项目骨架搭建好了,接下来创建数据模型!

👉 第3章 - 数据模型

最近更新: 2025/12/26 10:15
Contributors: 王长安
Prev
第1章 - 项目概述
Next
第3章 - 数据模型