Python烧瓶蓝图ImportError:无法导入名称'bp'

时间:2018-07-24 02:06:28

标签: python-3.x flask import attributeerror blueprint

我正在尝试让我的登录页面使用蓝图。在将python软件包拆分为单独的软件包之前,该应用仅通过app.py成功运行。但是,现在我试图使其更具模块化,我在运行该应用程序时遇到了麻烦,并且它不允许我导入我创建的blueprint

我的文件结构是这样的:

myapp/
run.py
myapp/
    __init.py__
    app.py
    models.py
...

这是我的run.py

from myapp import app
app.run(host= '0.0.0.0', debug=True)

我正在app.py中初始化我的蓝图:

.... 
from flask import Blueprint

bp = Blueprint('bp', __name__)

@bp.route('/')
@bp.route('/home')
....

我是这样从__init.py__叫它的:

app = Flask(__name__)
....
app.config...
app.config...
app.config...
....

from . import bp             # line 35
app.register_blueprint(bp)

但是,无论我将导入更改为什么,它始终抱怨无法导入

# python3 run.py
Traceback (most recent call last):
  File "run.py", line 1, in <module>
    from usb import app
  File "/my/path/to/myapp/myapp/__init__.py", line 35, in <module>
    from . import bp
ImportError: cannot import name 'bp'

我什至尝试将from . import bp更改为from myapp.app import bp,然后抛出另一个错误AttributeError: module 'myapp.app' has no attribute 'register_blueprint'

这是完整的错误:

  Traceback (most recent call last):
  File "run.py", line 1, in <module>
    from myapp import app
  File "/my/path/to/myapp/myapp/__init__.py", line 33, in <module>
    app.register_blueprint(bp)
AttributeError: module 'myapp.app' has no attribute 'register_blueprint'

有人知道我在这里做错了吗?

2 个答案:

答案 0 :(得分:0)

据我了解,您需要将from . import bp替换为 from myapp.app import bp。 发生这种情况的原因是__init__.py,它使软件包从“ myapp”目录生成,而python等待具有软件包名称的导入路径。

这是一个小例子: 项目结构:

myapp\
  myapp\
    __init__.py
    app.py
  run.py

run.py列表:

from myapp import app
app.run(host='0.0.0.0', debug=True)

myapp\__init__.py列表:

from flask import Flask
from myapp.app import bp

app = Flask(__name__)
app.register_blueprint(bp)

myapp\app.py列表:

from flask import Blueprint

@bp.route('/')
@bp.route('/home')
def home():
   return '<html><body><h1>Hello, World!</h1></body></html>'

答案 1 :(得分:-1)

发生此错误的原因是,您在调用bp实例之前未先加载它。当python解释器尝试加载路由时,例如:

# app/catalog/routes.py
from app.catalog import bp

@bp.route('/')
def hello():
   return "hello world"

并验证bp实例尚未加载,它返回错误,说明它没有找到bp模块。

为解决此问题,在蓝图配置文件中,必须在注册蓝图后调用路由。例如:

# app/catalog/__init__.py
from flask import Blueprint
bp = Blueprint('main', __name__, template_folder='templates')
from app.catalog import routes