L�nk?n 2024-05-28 15:38 采纳率: 0%
浏览 96
已结题

FastAPI Uvicorn启动显示404

安装了截至24年5月28日最新的FastAPI和Uvicorn库。在main.py中注册了所有路由,一律用app.include_router的方式。使用uvicorn启动后,点击中控的链接0.0.0.0:8000,浏览器弹窗显示{“detail”:”not found“},无论怎么修改域名后缀效果都一样。如果把路由直接放到main.py内,就可以正常访问。

为什么main.py中会发生路由注册失败?求大神指点


uvicorn app.main:app", host="0.0.0.0", port=8000, reload=True

#项目结构为:

project
|_main.py
|_routers\
| |_ __init__.py
| |_ page_router.py
| |_user_router.py
|_config\
|_templates\
|_static

我在main.py中注册了page_routers.py中的路由

from project.app.routers import page_router, user_router
app.include_router(page_router.router)
app.include_router(user_router.router)

#page_router.py里看上去是这样:

from fastapi import APIRouter
router = APIRouter()
@router.get("/")
async def root():
    return {"message": "Hello World"}

启动方式

直接run或者在终端用指令运行

if __name__ == "main":
import uvicorn
uvicorn.run("app.main:app", host="0.0.0.0", port=8000, reload=True)

经反复检查,发现下方代码影响了路由的正常导入,有谁能解释清楚原因我就直接采纳。

 @asynccontextmanager
# async def lifespan(app: FastAPI):
#     # Startup code here
#     print("Application startup")
#     try:
#         # 创建 Redis 连接
#         redis_client = redis.StrictRedis(
#             host=settings.REDIS_HOST,
#             port=settings.REDIS_PORT,
#             decode_responses=True
#         )
#         # 测试连接是否正常
#         if redis_client.ping():
#             print("Redis 连接成功")
#
#         # 测试 MySQL 连接
#         conn, cursor = get_db_connection()
#         cursor.execute("SELECT 1")
#         cursor.close()
#         conn.close()
#         print("MySQL 连接成功")
#
#     except redis.exceptions.ConnectionError as e:
#         print(f"Redis 连接异常: {e}")
#     except Exception as e:
#         print(f"MySQL 连接异常: {e}")
#     yield
#     # Shutdown code here
#     print("Application shutdown")
#     if hasattr(settings, 'redis_client'):
#         settings.redis_client.close()
#         print("Redis 连接关闭")
#
#         # 关闭 MySQL 连接池
#         pool.close()
#         print("MySQL 连接池关闭")
#
# app = FastAPI(lifespan=lifespan)
#
# # 启动应用时,启动Socket.IO后台任务
# @app.on_event("startup")
# async def startup_event():
#     from project.app.routers.socket_router import handle_startup
#     print("FastAPI startup event triggered")
#     sio.start_background_task(handle_startup)
  • 写回答

23条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-28 15:38
    关注
    获得0.30元问题酬金

    引自免费微信小程序:皆我百晓生

    看起来您的项目结构和代码片段都是正确的。在这种情况下,404 Not Found错误可能是因为 FastAPI 未能正确找到和处理您定义的路由。这可能是由于一些边缘情况导致的,比如环境变量设置、Python 文件导入路径等。我会提供一些排查步骤和可能的解决方案。

    首先,确保您的 main.py 文件包含以下内容:

    from fastapi import FastAPI
    from project.app.routers import page_router, user_router
    
    app = FastAPI()
    
    app.include_router(page_router.router)
    app.include_router(user_router.router)
    
    if __name__ == "__main__":
        import uvicorn
        uvicorn.run(app, host="0.0.0.0", port=8000, reload=True)
    

    确保将所有的路由器添加到同一个 FastAPI 实例 app 中。

    接下来,检查一下项目的根目录(也就是包含 project 的文件夹)是否有 __init__.py 文件。这个文件用于标识一个 Python 包,如果没有它,子模块可能不会被正确地导入。

    然后,确认 page_router.pyuser_router.py 文件的开头是否正确导入了 APIRouter 类:

    from fastapi import APIRouter
    
    router = APIRouter()
    

    如果您已经确认了上述所有内容,并且仍然遇到问题,您可以尝试以下方法进一步调试:

    1. 检查 Python 环境是否一致。确保在命令行中运行 uvicorn 时使用的 Python 解释器与 main.py 文件关联的解释器相同。可以使用 which pythonwhere python 命令查看当前默认的 Python 解释器。

    2. main.py 文件中添加一些日志输出,以便跟踪代码执行过程:

    import logging
    
    logging.basicConfig(level=logging.DEBUG)
    logger = logging.getLogger(__name__)
    
    ...
    
    @app.on_event("startup")
    async def startup_event():
        logger.info("Server started")
    
    @app.on_event("shutdown")
    async def shutdown_event():
        logger.info("Server stopped")
    
    ...
    

    然后,在命令行中运行 uvicorn 并观察日志输出,看看是否有任何异常或提示信息。

    1. 如果以上步骤都无法解决问题,尝试将 include_router 更改为直接将函数导入到 main.py 中,看看是否能正常工作。如果这样做可以正常工作,那么问题可能出在路由器的组织方式上,您可能需要重新审视路由器的导入逻辑。

    如果问题依然存在,请分享更多关于日志输出、项目结构和相关依赖的信息,这将有助于更准确地定位问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月5日
  • 修改了问题 5月29日
  • 创建了问题 5月28日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见