# 【路径兜底】本项目所有模块都用 `from sqlalchemy_fastapi_demo_1.xxx import ...` 导入, # 这要求「本项目的父目录」在 sys.path 里。直接右键运行 main.py 时 Python 只会把 # sqlalchemy_fastapi_demo_1 自身加入 sys.path,父目录不在其中,就会报 # ModuleNotFoundError: No module named 'sqlalchemy_fastapi_demo_1'。 # 这里主动把父目录补进去,保证 PyCharm 右键运行、命令行、Docker 三种方式都能跑。 import os import sys _PROJECT_PARENT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) if _PROJECT_PARENT_DIR not in sys.path: sys.path.insert(0, _PROJECT_PARENT_DIR) from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from sqlalchemy_fastapi_demo_1.api import statistics from sqlalchemy_fastapi_demo_1.database import engine, Base # 统一用「包名.模块」的方式导入,和 dao/model/scheme 里的写法保持一致。 # 裸写 `from api import ...` 只在工作目录恰好是本项目根时才能跑起来, # 放到 Docker 或其它目录运行就会 ModuleNotFoundError。 from sqlalchemy_fastapi_demo_1.api.c_lass import router as class_router from sqlalchemy_fastapi_demo_1.api import employment_api # 导入 employment_api 子路由 from sqlalchemy_fastapi_demo_1.api import Score from sqlalchemy_fastapi_demo_1.api.students import router as student_router from sqlalchemy_fastapi_demo_1.api.advisors import router as advisor_router from sqlalchemy_fastapi_demo_1.api import teachers Base.metadata.create_all(bind=engine) # 首次运行:如果数据库里还没有 c_lass 表,放开下面这行注释自动建表。 # 表已经建好的话,保持注释状态即可。 # Base.metadata.create_all(bind=engine) # 创建 FastAPI 实例 app = FastAPI( title="FastAPI + SQLAlchemy 分层架构", description="学生信息管理系统 - 班级模块", version="1.0.0", ) # 跨域中间件(前端网页访问后端接口需要) app.add_middleware( CORSMiddleware, allow_origins=["*"], # 开发期允许所有来源,上线应指定域名 allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 注册班级路由,统一加前缀 /c_lass app.include_router(class_router, prefix="/c_lass", tags=["班级管理模块"]) # ⑫ 把班级路由注册进应用,统一加前缀 /c_lass # 所以API层里 @router.post("/add") 的完整地址是 POST /c_lass/add app.include_router(employment_api.router, prefix="/api/employment_api", tags=["就业模块管理"]) app.include_router(Score.app_score, prefix="/api/score", tags=["成绩管理"]) app.include_router(student_router,prefix="/api/student", tags=["学生信息管理"]) app.include_router(advisor_router, prefix="/advisors", tags=["顾问老师模块"]) app.include_router(teachers.router, prefix="/api/teachers", tags=["老师模块管理"]) app.include_router(statistics.router,prefix="/api/statistics",tags=["统计模块"]) # 根路径 # @app.get("/") # async def root(): # return {"message": "欢迎访问!请访问 /docs 查看接口文档。"} # 直接运行此文件时启动 uvicorn if __name__ == "__main__": import os import uvicorn # 地址与端口同样从环境变量读取: # - 本地开发:默认 0.0.0.0:8004,局域网内的前端也能连上 # - Docker:容器必须监听 0.0.0.0,写 127.0.0.1 会导致外部访问不到 uvicorn.run( # 与上面的包名导入保持一致;运行入口请确保父目录在工作路径中(见 README 说明) "sqlalchemy_fastapi_demo_1.main:app", host=os.getenv("APP_HOST", "0.0.0.0"), port=int(os.getenv("APP_PORT", "8004")), # 容器里一般关掉热重载,可通过 APP_RELOAD=false 控制 reload=os.getenv("APP_RELOAD", "true").lower() in ("1", "true", "yes"), )