Flask蓝图报错:NameError: name 'pages'未定义,如何让Flask识别蓝图?
Flask蓝图识别失败(NameError: name 'pages' is not defined)修复方案
问题背景
站点目录结构如下:
home/user/website_name ├── ock/ │ ├── __init__.py │ ├── .env │ ├── routes.py │ ├── templates/ │ │ ├── base.html │ │ └── home.html │ └── static/ │ └── style.css ├── instance/ │ └── config.py ├── venv/ ├── setup.py └── wsgi.py
访问http://127.0.0.1:5000/home时抛出NameError: name 'pages' is not defined,核心原因是蓝图注册逻辑错误、路由装饰器使用不当,以及循环导入问题。
具体修复步骤
1. 修正ock/__init__.py
原代码存在未引用正确蓝图实例、缺少返回app逻辑的问题,修改后代码:
from flask import Flask def make_app(): app = Flask(__name__, instance_relative_config=True) app.config.from_pyfile('config.py') from . import routes # 注册routes模块中定义的bp蓝图实例,而非蓝图名称'pages' app.register_blueprint(routes.bp) return app # 必须返回app实例,供wsgi调用
2. 修正ock/routes.py
原代码错误使用全局app的路由装饰器,还存在循环导入问题,修改后代码:
from flask import render_template, Blueprint # 蓝图默认会加载同目录下的templates和static,可省略对应参数 bp = Blueprint('pages', __name__) # 使用蓝图自身的路由装饰器,而非全局app的 @bp.route('/') @bp.route('/index') @bp.route('/home') def home(): return render_template('home.html')
3. 确保wsgi.py正确初始化app
示例代码:
from ock import make_app app = make_app() if __name__ == '__main__': app.run(debug=True)
错误根源总结
- 混淆了蓝图名称('pages')与蓝图实例变量名(bp):注册蓝图需传入实例对象,而非蓝图名称
- 错误使用全局
app.route装饰器:蓝图的路由需绑定到蓝图实例,否则蓝图无法生效 - 循环导入问题:
routes.py导入wsgi.py的app会导致初始化顺序混乱,蓝图场景下无需导入全局app __init__.py未返回app实例:导致wsgi无法获取有效的Flask应用对象
内容的提问来源于stack exchange,提问作者jprado
相关产品推荐
相关产品推荐

