我正在尝试让我的登录页面使用蓝图。在将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'
有人知道我在这里做错了吗?
答案 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