Flask - избегайте кругового импорта с помощью фабрики приложений - PullRequest
0 голосов
/ 31 декабря 2018

Я структурировал мое приложение 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

app.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(),вот так:

project / 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

Как мне это исправить?

1 Ответ

0 голосов
/ 31 декабря 2018

Не импортировать app в routes.С фабрикой приложений у вас нет app для регистрации маршрутов за пределами фабрики .Вместо этого используйте чертежи для всех видов и импортируйте чертеж на завод.Вы могли бы по-прежнему регистрировать свои представления с помощью объекта app внутри фабрики , но это не так просто, как просто использовать план для регистрации представлений.

Вы уже делаете это свыделенные функции init_app(), но ваш модуль project/routes/tasks.py не следует этому шаблону.Это также должно использовать план.Вы можете делиться планом между модулями, если это упрощает ваше приложение.

Единственный момент, когда вы на самом деле создаете имя app, - это запуск всего приложения, поэтому для сервера WSGI, тестов или командной строкиинструменты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...