首页 > 解决方案 > Flask - 使用应用工厂避免循环导入

问题描述

flask以这样一种方式构建了我的应用程序,即应用程序工厂将所有__init__.py文件统一到一个app对象中,如下所示:

app.py
tasks.py
     /project/
             __init__.py
             routes/
                   __init__.py
                   auth_bp.py
                   register_bp.py
             models/
                   __init__.py
                   user.py
                   base.py

应用程序.py

from project import create_app

app = create_app()

项目/__init__.py

from flask import Flask

def create_app():

    from . import routes, models

    app = Flask(__name__)
    models.init_app(app)
    routes.init_app(app)

    return app

项目/模型/__init__,py

from base import db

def init_app(app):
    db.init_app(app)

项目/路线/__init__.py

from auth import auth_bp
from register import register_bp

def init_app(app):
    app.register_blueprint(auth_bp)
    app.register_blueprint(register_bp) 

我想要解决的是如何构建一些依赖于的后台进程app.context(),如下所示:

项目/tasks.py

import sys
sys.path.append('/path/to/root') 

from app import app

def load_cache(track_and_features):
    while True:
        with app.app_context():           
            Upload_Track(track_and_features) 

@app.route('/cache')
def cache(track_and_features):
    executor.submit(load_cache, track_and_features)
    return 'Ok'

问题(我猜)发生在这里,当我调用时,在轮流cache()导入对象的模块中:app

项目/路线/auth_bp.py

from tasks import cache

@auth_bp.route("/callback/q")
def callback():
    (...)
    cache()
    return redirect(url_for('register.homepage'))

我收到错误消息:

  File "app.py", line 6, in <module>
    app = create_app()
  File "/Users/me/Documents/Code/Apps/Production/project/__init__.py", line 20, in create_app
    from . import routes
  File "/Users/me/Documents/Code/Apps/Production/project/routes/__init__.py", line 1, in <module>
    from auth import auth_bp
  File "/Users/me/Documents/Code/Apps/Production/project/routes/auth.py", line 18, in <module>
    from tasks import cache
  File "/Users/me/Documents/Code/Apps/Production/tasks.py", line 4, in <module>
    from app import app
  File "/Users/me/Documents/Code/Apps/Production/app.py", line 6, in <module>
    app = create_app()
  File "/Users/me/Documents/Code/Apps/Production/project/__init__.py", line 20, in create_app
    from . import models, routes, services
ImportError: cannot import name routes

我该如何解决?

标签: pythonflask

解决方案


不要导入app. routes使用应用工厂,您无需app在工厂外注册路线。相反,为所有视图使用蓝图,并将蓝图导入工厂。您仍然可以使用appfactory 中的对象注册您的视图,但这并不像使用蓝图注册视图那么干净。

您已经使用专用init_app()函数执行此操作,但您的project/routes/tasks.py模块不遵循此模式。它也应该使用蓝图。如果可以简化您的应用程序,您可以在模块之间共享蓝图。

您实际创建app名称的唯一一点是运行整个应用程序,因此对于 WSGI 服务器、测试或命令行工具。


推荐阅读