【问题标题】:How can I import app from __init__.py and why I'm getting this error?如何从 __init__.py 导入应用程序以及为什么会出现此错误?
【发布时间】:2020-05-05 16:04:59
【问题描述】:

我想从__init__.py 导入dbmodel.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

bytewar.user/bytewar.admin/(在views.py 旁边)中添加__init__.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__.pybytewar/admin/__int__.py

from flask import Blueprint

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

为什么会这样?

【问题讨论】:

    标签: python python-3.x flask import importerror


    【解决方案1】:

    bytewar.user.views 中,您从__init__.py 导入数据库。但是,这仅在导入下方几行定义。因此,在导入完成时,db 尚不存在,错误证实了这一点。当您查看应用程序工厂1 的示例代码时,您会看到app 变量仅在定义后才使用,您的代码也应该这样做。将你的导入移动到底部,然后你就设置好了。

    顺便说一句:为什么要在工厂创建app 并立即覆盖它?留下第二个创作。

    【讨论】:

    • 拜托,你能在代码中定义以便我更好地理解吗?
    • 我的__init__.py 和应用程序树的结构是否良好?如果不是这样,那么有效的方法是什么。让我明白。
    • 例子没看懂,链接给你了!
    • 链接指向文档。您的 '__init__.py' 不正确。根据建议将导入从“bytewars.user.views”和“bytewars.admin.views”移到函数的末尾。
    • 以及为什么我需要将我的 __init__.py' 移动到 user/ 文件夹。我有一个__init__.py,我删除了它,因为我的烧瓶没有检测到style.css 文件,但我仍然遇到同样的问题。你可以看看我的question。我会很感激你的。
    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多