我正在尝试让我的登录页面使用蓝图。在我将 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'
有人知道我在这里做错了什么吗?
据我了解,您需要将
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>'
我也遇到过类似的事情。创建一个与库同名的文件夹并导入它是一个菜鸟错误。哎呀。
文件夹结构:
.
├── main.py
├── numpy # this name here is the problem
│ └── __init__.py
└── routes
└── index.py
index.py
文件使用实际的numpy
库,按如下方式导入它import numpy as np
,这引发了错误。
我只需将
numpy
目录重命名为与库名称不对应的其他名称。
出现此错误是因为您在没有先加载 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