Files

85 lines
3.8 KiB
Python

# 【路径兜底】本项目所有模块都用 `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"),
)