05. 开发后端登录api接口
全局配置类
先加上配置文件 .env
DATABASE_URL=mysql+pymysql://root:123456@127.0.0.1:3306/lab_agent再创建 config.py
from pydantic_settings import BaseSettings, SettingsConfigDict
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent # 后端项目的根路径
class Settings(BaseSettings):
DATABASE_URL: str
model_config = SettingsConfigDict(
env_file=BASE_DIR / ".env", env_file_encoding="utf-8"
)
settings = Settings()
在 vscode 里配置 pyhon 项目的虚拟环境

配置 Base 类和数据库会话工厂
Base 类就是所有数据库模型的公共父类,用来统一定义所有表都会拥有的公共字段和数据库配置。
from sqlalchemy.orm import sessionmaker, DeclarativeBase, Mapped, mapped_column
from sqlalchemy import create_engine, DateTime
from app.config import settings
from datetime import datetime
engine = create_engine(settings.DATABASE_URL)
# 数据库session会话的连接工厂
SessionLocal = sessionmaker(bind=engine, autoflush=False)
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
class Base(DeclarativeBase):
id: Mapped[int] = mapped_column(
primary_key=True, autoincrement=True, comment="主键ID"
)
create_time: Mapped[datetime] = mapped_column(
DateTime, default=datetime.now, comment="创建时间"
)
update_time: Mapped[datetime] = mapped_column(
DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间"
)
创建用户 model
models/user.py
from sqlalchemy.orm import Mapped, mapped_column
from sqlalchemy import String
from app.database import Base
class User(Base):
__tablename__ = "users"
__table_args__ = {"comment": "用户信息表"}
username: Mapped[str] = mapped_column(String(50), comment="账号", nullable=False)
password: Mapped[str] = mapped_column(String(50), comment="密码", nullable=False)
name: Mapped[str] = mapped_column(String(50), comment="名称", nullable=False)
role: Mapped[str] = mapped_column(
String(50), comment="角色:student-学生,admin-管理员", nullable=False
)
email: Mapped[str | None] = mapped_column(String(50), comment="邮箱")
phone: Mapped[str | None] = mapped_column(String(50), comment="手机号")
avatar: Mapped[str | None] = mapped_column(String(50), comment="头像")
status: Mapped[int] = mapped_column(default=1, comment="状态:0-禁用,1-正常")
自动创建表 user
User是模型,Base.metadata.create_all()根据模型创建数据库表。
from app.models.user import User
from app.database import Base, engine
Base.metadata.create_all(bind=engine)创建数据库 lab_agent

创建 Schemas
schemas/auth.py
BaseModel是 Pydantic 的基类。 只要类继承BaseModel,它就获得这些能力:
- 字段类型校验(
str/int等)- 自动解析 JSON → Python 对象
- 自动生成错误信息
- FastAPI 自动识别它,生成接口文档
schemas/auth.py
from pydantic import BaseModel
class LoginRequest(BaseModel):
username: str
password: strschemas/user.py
from pydantic import BaseModel, ConfigDict
class UserResponse(BaseModel):
id: int
username: str
name: str
role: str
phone: str | None = None
email: str | None = None
status: int
model_config = ConfigDict(from_attributes=True)创建 API 接口
api/auth.py
from fastapi import APIRouter, Depends
from app.schemas.auth import LoginRequest
from sqlalchemy.orm import Session
from app.database import get_db
from app.models.user import User
from app.schemas.user import UserResponse
router = APIRouter(prefix="/api/auth", tags=["权限验证"])
@router.post("/login")
def login(data: LoginRequest, db: Session = Depends(get_db)):
user = db.query(User).filter(User.username == data.username).first()
# 判断账号和密码是否正确
if not user or user.password != data.password:
return {"code": 400, "message": "账号或密码错误"}
return {
"code": 200,
"message": "操作成功",
"data": UserResponse.model_validate(user),
}
在 main.py 里面导入
from app.api.auth import router as auth_router
app.include_router(auth_router)api post 测试
测试 Http 请求的工具:https://www.apipost.cn/
请求接口: **POST **http://127.0.0.1:8000/api/auth/login

VsCode 里面 Python 的配置
自动导包
{
"python.analysis.autoImportCompletions": true,
"python.languageServer": "Pylance",
"editor.quickSuggestions": {
"other": true,
"comments": false,
"strings": false
},
"[python]": {
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit"
}
}
}python.analysis.autoImportCompletions: true 👉 开启自动导入补全(默认关闭)GitHubsource.organizeImports👉 Ctrl+S 保存时,自动整理导入、删除没用的 import、排序(推荐搭配 ruff)