url_for
是否适用于蓝图?
/flaskapp
/runserver.py (from server import app; app.run(debug=True))
/server
/__init__.py (app = Flask(__name__))
/pages
/__init__.py ('pages' blueprint)
/users
/__init__.py ('users' blueprint)
server/__init__.py
中的:
from server.pages import pages
from server.users import users
app = Flask(__name__)
app.register_blueprint(pages)
app.register_blueprint(users)
server/pages/__init__.py
中的:
pages = Blueprint('pages', __name__)
@pages.route('/')
def index(): return '<h1>Index</h1>'
server/users/__init__.py
中的:
users = Blueprint('users', __name__)
@users.route('/login')
def login():
...
return redirect(url_for('pages.index'))
^^^^^^^^^^^^^^^^^^^^^^
url_for
来电提升BuildError: ('pages.index', {}, None)
什么是到达'pages.index'
的方式?
(我尝试导入模块,但那不起作用)
答案 0 :(得分:4)
我可以告诉你,你正在以你应该的方式组织你的应用程序。
我已经重新创建了您的设置(尽管只在一个文件中),您可以在此处查看。这段代码在我的机器上运行。
https://gist.github.com/enlore/80bf02346d6cabcba5b1
在flask中,您可以在拥有的蓝图中使用相对端点(.login
)访问给定的视图函数,或者在任何地方访问绝对的(user.login
)。
我的钱是在视图函数名称中输入错误。
像Mark Hildreth在评论中所说,调试问题的一个好方法是查看你的网址图。>>> from app import app
>>> app.url_map
Map([<Rule '/login' (HEAD, OPTIONS, GET) -> user.login>,
<Rule '/' (HEAD, OPTIONS, GET) -> pages.index>,
<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>])
>>>
答案 1 :(得分:2)
如果您使用的是url_value_preprocessor
,请确保您正确设置了url_defaults
,否则url_for
没有足够的值来构建网址,您会收到相当混乱的错误消息。
实施例
@bp.url_value_preprocessor
def get_project(endpoint, values):
project_name = values.pop('project_name')
g.project = Project.query.filter_by(name=project_name).first_or_404()
@bp.url_defaults
def add_project(endpoint, values):
if 'project_name' in values or not g.project:
return
values['project_name'] = g.project.name