не может импортировать имя "приложение" круговой проблемы импорта - PullRequest
0 голосов
/ 28 мая 2019

У меня были некоторые проблемы с моим кодом в течение нескольких часов.

Я уверен, что это вызвано проблемой кругового импорта, но у меня есть другой вопрос.

Iесть два плана, аутентификации и основной.Я просто возвращаю render_template без передачи данных, и все идет хорошо.Но когда я пытаюсь что-то показать в моем main.index, внезапно возникает ошибка.

Интересно, почему это работает нормально только в auth.views, хотя есть проблема кругового импорта?

моя структура дерева

app
  |- auth 
       |- __init__.py
       |- forms.py
       |- views.py
  |- main
       |- __init__.py
       |- forms.py
       |- views.py
  |- template
  |- __init__.py
  |- models.py
config.py
manage.py
datta.sqlite

В auth.__init__.py:

from flask import Blueprint

auth = Blueprint("auth", __name__)

from . import views

и в auth.views.py

from app.auth import auth
from app.models import *
from manage import app


@auth.route('/')
def index():
    page = request.args.get("page", 1, type=int)
    articles = Article.query.order_by(Article.update_time.desc()).paginate(
        page, app.config["ARTICLES_PER_PAGE"], False)

    next_url = url_for('auth.index', page=articles.next_num if articles.has_next else None)
    prev_url = url_for('auth.index', page=articles.prev_num if articles.has_prev else None)
    return render_template('index.html', articles=articles.items,
                           next_url=next_url, prev_url=prev_url)

В main.__init__.py:

from flask import Blueprint

main = Blueprint("main", __name__)

from . import views

В main.views.py:

from app.main import main
from app.models import *
from manage import app

@main.route('/')
def index():
    page = request.args.get("page", 1, type=int)
    articles = Article.query.order_by(Article.update_time.desc()).paginate(
        page, app.config["ARTICLES_PER_PAGE"], False)

    next_url = url_for('main.index', page=articles.next_num if articles.has_next else None)
    prev_url = url_for('main.index', page=articles.prev_num if articles.has_prev else None)
    return render_template('index.html', articles=articles.items,
                           next_url=next_url, prev_url=prev_url)

В app.__init__.py:

def create_app():
    app = Flask(__name__)
    app.config.from_object(Config)
    Config.init_app(app)
    ...
    from app.main import main
    app.register_blueprint(main)

    from app.auth import auth
    app.register_blueprint(auth, url_prefix='/auth')

    return app

в manage.py

from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager, Shell

from app import create_app, db
from app.models import *

app = create_app()
manager = Manager(app)
migrate = Migrate(app, db)
manager.add_command('db', MigrateCommand)


def make_shell_context():
    return dict(db=db, ArticleType=ArticleType, Source=Source,
                Article=Article, User=User, Menu=Menu,
                ArticleTypeSetting=ArticleTypeSetting)


manager.add_command("shell", Shell(make_context=make_shell_context))
manager.add_command("db", MigrateCommand)


if __name__ == '__main__':
    app.run(debug=True)

И мой tracebackявляются следующие:

Traceback (most recent call last):
  File "C:/Users/bohn/Desktop/1pycharm workspace/BlogPoweredByFlask/manage.py", line 7, in <module>
    app = create_app()
  File "C:\Users\bohn\Desktop\1pycharm workspace\BlogPoweredByFlask\app\__init__.py", line 30, in create_app
    from app.main import main
  File "C:\Users\bohn\Desktop\1pycharm workspace\BlogPoweredByFlask\app\main\__init__.py", line 5, in <module>
    from . import views
  File "C:\Users\bohn\Desktop\1pycharm workspace\BlogPoweredByFlask\app\main\views.py", line 5, in <module>
    from manage import app
  File "C:\Users\bohn\Desktop\1pycharm workspace\BlogPoweredByFlask\manage.py", line 7, in <module>
    app = create_app()
  File "C:\Users\bohn\Desktop\1pycharm workspace\BlogPoweredByFlask\app\__init__.py", line 33, in create_app
    from app.auth import auth
  File "C:\Users\bohn\Desktop\1pycharm workspace\BlogPoweredByFlask\app\auth\__init__.py", line 5, in <module>
    from . import views
  File "C:\Users\bohn\Desktop\1pycharm workspace\BlogPoweredByFlask\app\auth\views.py", line 9, in <module>
    from manage import app
ImportError: cannot import name 'app'

1 Ответ

1 голос
/ 28 мая 2019

Путь к этому - использовать flask.current_app вместо попытки импорта app.

В main.views заменить

from manage import app

с

from flask import current_app

затем вместо app.config[...] используйте current_app.config[...]

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