Flask中使用变量和url_for的构建错误

18 投票
7 回答
56931 浏览
提问于 2025-04-17 11:09

我在网上找到一两个遇到类似问题的人,但没有看到有人提供解决方案。我在下面的代码/模板中遇到了构建错误,但我搞不清楚问题出在哪里,也不知道为什么会出现这个问题。看起来模板没有识别这个函数,但我不知道为什么会这样。任何帮助都非常感谢——我已经在键盘上敲了两个晚上了。

函数:

@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 个回答

1

我还是想回复一下这个问题,尽管它已经有答案了。原因是为了更清楚地说明。即使看了那些答案,我还是不太明白发生了什么,直到我查看了url_for()的源文件。

下面是一个简单的例子:

<a href="{{ url_for('viewproj', proj='<projname>') }}">Project name</a>

@app.route('/viewproj/<projname>', methods=['GET','POST'])
def viewproj(proj):
22

我刚刚解决了同样的问题,方法真的很有趣。

只需要在你的方法名之前加一个 '.',在 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')
25

url_for 是用来查找一个函数的,你需要把你想要调用的函数的名字传给它。
所以你应该这样使用:

{{ url_for('viewproj', proj=xxx) }}

我也遇到了同样的问题。然后我按照这个方法解决了:Flask 错误: werkzeug.routing.BuildError

撰写回答