Flask中使用变量和url_for的构建错误
我在网上找到一两个遇到类似问题的人,但没有看到有人提供解决方案。我在下面的代码/模板中遇到了构建错误,但我搞不清楚问题出在哪里,也不知道为什么会出现这个问题。看起来模板没有识别这个函数,但我不知道为什么会这样。任何帮助都非常感谢——我已经在键盘上敲了两个晚上了。
函数:
@app.route('/viewproj/<proj>', methods=['GET','POST'])
def viewproj(proj):
...
模板摘录:
{% for project in projects %}
<li>
<a href="{{ url_for('viewproj', proj=project.project_name) }}">
{{project.project_name}}</a></li>
{% else %}
No projects
{% endfor %}
错误日志: https://gist.github.com/1684250
编辑:我还想补充一下,在构建URL时,它没有识别变量“proj”,所以只是把这个值当作参数附加上去了。这里有个例子: //myproject/viewproj?projname=what+up
最后几行:
[Wed Jan 25 09:47:34 2012] [error] [client 199.58.143.128] File "/srv/www/myproject.com/myproject/templates/layout.html", line 103, in top-level template code, referer: xx://myproject.com/
[Wed Jan 25 09:47:34 2012] [error] [client 199.58.143.128] {% block body %}{% endblock %}, referer: xx://myproject.com/
[Wed Jan 25 09:47:34 2012] [error] [client 199.58.143.128] File "/srv/www/myproject.com/myproject/templates/main.html", line 34, in block "body", referer: xx://myproject.com/
[Wed Jan 25 09:47:34 2012] [error] [client 199.58.143.128] <a href="{{ url_for('viewproj', proj=project.project_name) }}">, referer: xx://myproject.com/
[Wed Jan 25 09:47:34 2012] [error] [client 199.58.143.128] File "/usr/lib/python2.7/dist-packages/flask/helpers.py", line 195, in url_for, referer: xx://myproject.com/
[Wed Jan 25 09:47:34 2012] [error] [client 199.58.143.128] return ctx.url_adapter.build(endpoint, values, force_external=external), referer: xx://myproject.com/
[Wed Jan 25 09:47:34 2012] [error] [client 199.58.143.128] File "/usr/lib/pymodules/python2.7/werkzeug/routing.py", line 1409, in build, referer: xx://myproject.com/
[Wed Jan 25 09:47:34 2012] [error] [client 199.58.143.128] raise BuildError(endpoint, values, method), referer: xx://myproject.com/
[Wed Jan 25 09:47:34 2012] [error] [client 199.58.143.128] BuildError: ('viewproj', {'proj': '12th'}, None), referer: xx://myproject.com/
7 个回答
我还是想回复一下这个问题,尽管它已经有答案了。原因是为了更清楚地说明。即使看了那些答案,我还是不太明白发生了什么,直到我查看了url_for()的源文件。
下面是一个简单的例子:
<a href="{{ url_for('viewproj', proj='<projname>') }}">Project name</a>
@app.route('/viewproj/<projname>', methods=['GET','POST'])
def viewproj(proj):
我刚刚解决了同样的问题,方法真的很有趣。
只需要在你的方法名之前加一个 '.',在 url_for 里就可以了。
像这样:
<a href="{{ url_for('.viewproj', proj=project.project_name) }}">
现在应该可以正常工作了。
这个解决方案的文档来自 Flask,链接是 http://flask.pocoo.org/docs/0.10/api/,我引用一下:
flask.url_for(endpoint, **values) 这个函数会生成一个指向给定端点的 URL,并使用提供的方法。
如果有一些变量参数在目标端点中是未知的,它们会被添加到生成的 URL 作为查询参数。如果查询参数的值是 None,那么这一对参数就会被跳过。如果蓝图(blueprints)处于活动状态,你可以通过在本地端点前加一个点(.)来简化对同一蓝图的引用。
这样就可以引用当前蓝图中的 index 函数:
url_for('.index')
url_for 是用来查找一个函数的,你需要把你想要调用的函数的名字传给它。
所以你应该这样使用:
{{ url_for('viewproj', proj=xxx) }}
我也遇到了同样的问题。然后我按照这个方法解决了:Flask 错误: werkzeug.routing.BuildError