Python Flask 蓝图导入错误:无法导入名称“bp”

问题描述 投票:0回答:3

我正在尝试让我的登录页面使用蓝图。在我将 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'

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

python-3.x flask import attributeerror blueprint
3个回答
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>'

0
投票

我也遇到过类似的事情。创建一个与库同名的文件夹并导入它是一个菜鸟错误。哎呀。

文件夹结构:

.
├── main.py
├── numpy # this name here is the problem
│   └── __init__.py
└── routes
    └── index.py

index.py
文件使用实际的
numpy
库,按如下方式导入它
import numpy as np
,这引发了错误。

我只需将

numpy
目录重命名为与库名称不对应的其他名称。


-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
© www.soinside.com 2019 - 2024. All rights reserved.