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

Rob*_*Rob 18 python build-error werkzeug url-for flask

在类似问题的互联网上找到一两个人,但没有看到任何地方发布的解决方案.我从下面的代码/模板中得到了构建错误,但无法确定问题的位置或原因.似乎模板没有识别该功能,但不知道为什么会发生这种情况.任何帮助将不胜感激 - 现在已经敲了两下我的键盘.

功能:

@app.route('/viewproj/<proj>', methods=['GET','POST'])
def viewproj(proj):
Run Code Online (Sandbox Code Playgroud)

...

模板摘录:

{% for project in projects %}
  <li>
<a href="{{ url_for('viewproj', proj=project.project_name) }}">
{{project.project_name}}</a></li>
{% else %}
No projects
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

错误日志: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/
Run Code Online (Sandbox Code Playgroud)

atu*_*pal 25

url_for查找一个函数,你传递它想要调用的函数的名称.所以你应该使用:

{{ url_for('viewproj', proj=xxx) }}
Run Code Online (Sandbox Code Playgroud)

我遇到了同样的问题.我解决了它:Flask错误:werkzeug.routing.BuildError


Art*_*ang 20

刚刚解决了同样的问题,解决方案真的很有趣.

只需添加'.' 在url_for中的方法名称前面.

像这样:

<a href="{{ url_for('.viewproj', proj=project.project_name) }}">
Run Code Online (Sandbox Code Playgroud)

它现在应该工作了.

Flask的这个解决方案的文档是http://flask.pocoo.org/docs/0.10/api/,我引述:

flask.url_for(endpoint,**values)使用提供的方法生成指向给定端点的URL.

目标端点未知的变量参数作为查询参数附加到生成的URL.如果查询参数的值为None,则跳过整个对.如果蓝图处于活动状态,您可以通过在本地端点前加一个点(.)来快捷方式对同一蓝图的引用.

这将引用当前蓝图的本地索引函数:

url_for('.index')
Run Code Online (Sandbox Code Playgroud)


小智 -3

当您指定该端点上可用的方法时,我认为您必须将所需的方法传递到 url_for 中。

url_for('viewproj', proj=project.project_name, method='GET')
Run Code Online (Sandbox Code Playgroud)

  • 无关。这些方法在路由调用中指定,因为默认情况下只允许 GET。构建 URL 时,您不需要指定方法。 (4认同)