使用APIRouter时FastAPI应用启动失败,无法导入app.main模块
问题排查与解决方案
1. 修复模块导入缺失问题
你的main.py直接使用user_controller.router但未导入对应模块,这是启动失败的核心原因之一。修改main.py如下:
from fastapi import FastAPI from presentation.user_controller import router as user_router app = FastAPI() app.include_router(user_router)
同时,user_controller.py缺少必要的依赖导入,补充后代码如下:
from fastapi import APIRouter from pymongo import MongoClient import os router = APIRouter( prefix="/users", tags=["users"], responses={404: {"description": "Not found"}}, ) client = MongoClient(os.environ['MONGODB_CONNSTRING']) db = client['fullkron'] users = db['users'] @router.get("/") async def get_users(): # 同步MongoClient的find()返回游标,需转换为列表才能被FastAPI序列化 return list(users.find())
2. 配置Python包识别路径
presentation作为app的子目录,需要被识别为Python包。在presentation目录下创建空的__init__.py文件,目录结构更新为:
├── app │ ├── presentation │ │ ├── __init__.py │ │ ├── user_controller.py │ ├── main.py
3. 处理MongoDB连接与异步兼容问题
- 确保Docker启动时传入
MONGODB_CONNSTRING环境变量,比如启动命令添加:-e MONGODB_CONNSTRING="你的MongoDB连接字符串" - 同步
MongoClient在异步接口中会引发阻塞问题,建议改用异步驱动motor:- 在
requirements.txt中添加motor - 修改
user_controller.py适配异步操作:
- 在
from fastapi import APIRouter from motor.motor_asyncio import AsyncIOMotorClient import os router = APIRouter( prefix="/users", tags=["users"], responses={404: {"description": "Not found"}}, ) client = AsyncIOMotorClient(os.environ['MONGODB_CONNSTRING']) db = client['fullkron'] users = db['users'] @router.get("/") async def get_users(): user_list = [] async for user in users.find(): # 将ObjectId转为字符串,避免序列化错误 user["_id"] = str(user["_id"]) user_list.append(user) return user_list
4. 容器内调试定位
若仍启动失败,可进入容器手动测试模块导入,精准定位问题:
# 进入容器 docker exec -it <容器ID> bash # 测试模块导入 python -c "from app.main import app"
根据终端报错信息进一步排查。
内容的提问来源于stack exchange,提问作者lucasfelber
相关产品推荐
相关产品推荐

