首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python flask blueprint ImportError:无法导入名称'bp‘

Python flask blueprint ImportError:无法导入名称'bp‘
EN

Stack Overflow用户
提问于 2018-07-24 10:06:28
回答 2查看 3.5K关注 0票数 1

我正在尝试让我的登录页面与蓝图工作。在我将我的python包分成单独的包之前,该应用程序仅使用app.py就可以成功运行。然而,现在我试图让它更模块化,我在运行应用程序时遇到了问题,它不让我导入我创建的blueprint

我的文件结构是这样的:

代码语言:javascript
复制
myapp/
run.py
myapp/
    __init.py__
    app.py
    models.py
...

这是我的run.py

代码语言:javascript
复制
from myapp import app
app.run(host= '0.0.0.0', debug=True)

我在app.py中初始化蓝图,如下所示:

代码语言:javascript
复制
.... 
from flask import Blueprint

bp = Blueprint('bp', __name__)

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

我从__init.py__调用它,如下所示:

代码语言:javascript
复制
app = Flask(__name__)
....
app.config...
app.config...
app.config...
....

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

但是,无论我将导入更改为什么,它都会一直抱怨它不能导入

代码语言:javascript
复制
# 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'

下面是完整的错误:

代码语言:javascript
复制
  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'

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

EN

回答 2

Stack Overflow用户

发布于 2018-07-24 16:16:26

据我所知,您需要将from . import bp替换为from myapp.app import bp。发生这种情况是因为__init__.py,它使包从'myapp‘目录,和python等待包名称的导入路径。

下面是一个小示例:项目结构:

代码语言:javascript
复制
myapp\
  myapp\
    __init__.py
    app.py
  run.py

run.py列表:

代码语言:javascript
复制
from myapp import app
app.run(host='0.0.0.0', debug=True)

myapp\__init__.py列表:

代码语言:javascript
复制
from flask import Flask
from myapp.app import bp

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

myapp\app.py列表:

代码语言:javascript
复制
from flask import Blueprint

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

Stack Overflow用户

发布于 2020-06-25 02:39:04

出现此错误的原因是,您在调用bp实例时没有先加载它。当python解释器尝试加载路由时,例如:

代码语言:javascript
复制
# app/catalog/routes.py
from app.catalog import bp

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

并且验证bp实例还没有被加载,则它返回错误,描述它还没有找到bp模块。

因此,为了解决这个问题,在蓝图配置文件中,必须在注册蓝图之后调用路由。示例:

代码语言:javascript
复制
# app/catalog/__init__.py
from flask import Blueprint
bp = Blueprint('main', __name__, template_folder='templates')
from app.catalog import routes
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51489448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档