Как я могу импортировать приложение из __init__.py и почему я получаю эту ошибку? - PullRequest
0 голосов
/ 19 января 2020

Я хочу импортировать db из __init__.py в файл model.py, но не могу импортировать, появляется сообщение об ошибке:

Traceback (most recent call last):
  File "/home/rohit/Desktop/flask_app/run.py", line 1, in <module>
    from bytewar import create_app
  File "/home/rohit/Desktop/flask_app/bytewar/__init__.py", line 5, in <module>
    from bytewar.user.views import user_blueprint
  File "/home/rohit/Desktop/flask_app/bytewar/user/views.py", line 9, in <module>
    from bytewar.model import Login_form, Login, Post, Contacts, Signup_form, Contacts
  File "/home/rohit/Desktop/flask_app/bytewar/model.py", line 5, in <module>
    from bytewar import db
ImportError: cannot import name 'db'

Дерево моего приложения:

___ run.py     # <<------- ImportError in this file.
___ bytewar/
  |__ __init__.py
  |__ config.py
  |__ model.py       
  |__ user/
  |   |__ __init__.py
  |   |__ views.py
  |   |__ static/
  |   |    |__ img/
  |   |    |__ ....
  |   |__ template/
  |       |__ index.html
  |       |__ about.html
  |
  |__ admin/
      |__ __init__.py
      |__ views.py
      |__ template/
          |__ index.html
          |__ about.html

__ init__.py:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bootstrap import Bootstrap 
from flask_login import LoginManager
from bytewar.user.views import user_blueprint
from bytewar.admin.views import admin_blueprint

db = SQLAlchemy()

def create_app():
    app = Flask('bytewar')
    app = Flask(__name__.split('.')[0])
    app.config.from_pyfile('config.py')
    app.config['DEBUG'] = True

    app.register_blueprint(user_blueprint)
    app.register_blueprint(admin_blueprint)

    login_manager = LoginManager()
    bootstrap = Bootstrap(app)

    db.init_app(app)
    login_manager.init_app(app)
    login_manager.session_protection = 'strong'

    return app

Здесь вы можете видеть, что у меня db.init_app(app), но все же я получаю ImportError.

После добавления файла __init__.py внутри bytewar.user/ и bytewar.admin/ (рядом с views.py) я получаю ошибку в run.py:

Traceback (most recent call last):
  File "/home/rohit/Desktop/flask_app/run.py", line 1, in <module>
    from bytewar import app
  File "/home/rohit/Desktop/flask_app/bytewar/__init__.py", line 5, in <module>
    from bytewar.user.views import user_blueprint
  File "/home/rohit/Desktop/flask_app/bytewar/user/views.py", line 9, in <module>
    from bytewar.model import Login_form, Login, Post, Contacts, Signup_form, Contacts
  File "/home/rohit/Desktop/flask_app/bytewar/model.py", line 5, in <module>
    from run import db
  File "/home/rohit/Desktop/flask_app/run.py", line 1, in <module>
    from bytewar import app
ImportError: cannot import name 'app'

run.py:

from bytewar import app


if __name__ == "__main__":
    app.run()

Мой bytewar/user/__init__.py и как он есть bytewar/admin/__int__.py:

from flask import Blueprint

user_blueprint = Blueprint(
    'user', __name__,
    static_folder='static',
    template_folder='template',
 )

Почему это происходит?

1 Ответ

1 голос
/ 19 января 2020

В bytewar.user.views вы импортируете дб из вашего __init__.py. Это, однако, определяется только несколькими строками ниже импорта. Таким образом, во время импорта, db еще не существует, что подтверждает ошибка. Когда вы посмотрите на пример кода для фабрики приложений 1 , вы увидите, что переменная app используется только после того, как она определена, ваш код тоже должен это делать. Переместите импорт вниз, и вы настроены.

В качестве отступления: почему вы создаете app на заводе и сразу же перезаписываете его? Оставьте второе создание вне.

...