FastAPI + LangGraph 从零开发智能实验室预约系统

本集视频在 B 站 BV13hbP6zEUd · P6

去 B 站看本集

05. 开发后端登录api接口

全局配置类

先加上配置文件 .env

text
DATABASE_URL=mysql+pymysql://root:123456@127.0.0.1:3306/lab_agent

再创建 config.py

python
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 类就是所有数据库模型的公共父类,用来统一定义所有表都会拥有的公共字段和数据库配置。

python
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

python
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() 根据模型创建数据库表。

python
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

python
from pydantic import BaseModel

class LoginRequest(BaseModel):
    username: str
    password: str

schemas/user.py

python
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

python
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 里面导入

python
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 的配置

自动导包

json
{
  "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 👉 开启自动导入补全(默认关闭)GitHub
  • source.organizeImports 👉 Ctrl+S 保存时,自动整理导入、删除没用的 import、排序(推荐搭配 ruff)
05. 开发后端登录api接口 · 青戈AI小栈