使用uWSGI运行Flask应用时路由未加载,如何解决?
问题原因
你遇到的核心问题是:start.wsgi中创建了一个全新的Flask应用实例,但aircraft_tracker.py里的路由是注册在它自身创建的另一个独立实例上的,两者没有关联,导致uWSGI加载的实例没有任何路由。
解决方案(两种优雅方式,无循环依赖)
方案1:快速复用已注册路由的应用实例
修改start.wsgi,直接导入aircraft_tracker里已经绑定好路由的app实例:
from aircraft_tracker import app as application
同时在wsgi.ini中添加Python路径配置,确保uWSGI能识别你的项目模块:
wsgi-file = /aircraft/start.wsgi pythonpath = /aircraft # 指定项目根目录为Python搜索路径
这种方式无需调整现有代码结构,快速解决问题,但路由分散在主文件中,后续扩展多路由时会增加维护成本。
方案2:应用工厂+路由注册(推荐,符合Flask最佳实践)
将路由逻辑整合到app包内部,通过注册函数绑定到应用实例,更利于长期维护:
- 在
app目录下新建routes.py,封装路由注册逻辑:
def register_routes(app): @app.route('/aircraft', methods=['GET']) def get_aircraft(): """Return a list of all active aircraft""" # 替换为你的实际业务逻辑 aircraft = [] return aircraft
- 修改
app/__init__.py,在应用工厂中调用路由注册:
from flask import Flask import settings from .routes import register_routes def create_app(): flask_app = Flask(settings.APP_NAME) flask_app.config.from_prefixed_env() # 绑定所有路由到当前应用实例 register_routes(flask_app) return flask_app
- 简化
aircraft_tracker.py,仅保留开发环境启动入口:
from app import create_app app = create_app() if __name__ == "__main__": app.run(host="0.0.0.0")
start.wsgi保持原有代码即可:
from app import create_app application = create_app()
这种方式遵循Flask应用工厂模式,路由集中管理,后续添加新路由只需扩展routes.py,完全避免循环依赖问题。
内容的提问来源于stack exchange,提问作者user7692855
相关产品推荐
相关产品推荐

