第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 - 健康检查
📝 小结
本章我们完成了:
- ✅ 创建项目目录结构
- ✅ 配置虚拟环境和依赖
- ✅ 创建配置文件
- ✅ 配置数据库连接
- ✅ 创建通用响应模型
- ✅ 创建主程序入口
- ✅ 成功运行项目
🏃 下一步
项目骨架搭建好了,接下来创建数据模型!
