18

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

功能:

@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/
4

7 回答 7

25

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

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

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

于 2013-04-05T16:04:55.097 回答
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,则跳过整个对。如果蓝图处于活动状态,您可以通过在本地端点前加上一个点 (.) 来快捷引用相同的蓝图。

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

url_for('.index')
于 2014-08-25T23:57:57.717 回答
1

我仍然回复这个,即使它已经被回答了。原因是为了清楚。即使在阅读了它们之后,如果不查看 url_for() 的源文件,我也无法理解发生了什么。

一个干净的例子:

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

@app.route('/viewproj/<projname>', methods=['GET','POST'])
def viewproj(proj):
于 2014-03-18T22:13:01.940 回答
0

您很可能拥有多个名为 的路由函数viewproj

除此之外,您发布的输出与您发布的模板代码不对应。myproject/viewproj?projname=what+up表示projname=...已传递给url_for(),但您的视图函数需要proj=...

于 2012-06-01T17:15:26.883 回答
0

查看模板中的“project.project_name”是否正确解析。您是否将“项目”正确传递给模板?改为硬编码“proj”的一些值,然后查看 url 正在生成。就像是:-

<a href="{{ url_for('viewproj', proj='new_project') }}">new project</a>
于 2012-01-27T13:45:15.387 回答
-3

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

url_for('viewproj', proj=project.project_name, method='GET')
于 2012-01-27T07:59:12.277 回答
-4

我用谷歌搜索了同样的问题并发现了这个,所以我想我会在我敲了一会儿之后发布对我有用的东西(以防其他人登陆这里)。看起来它可能只是一个字符串连接问题

我错误地“翻译”了我的工作代码:

{% for project in projects %}
    <li>
    <a href="{{ url_for('viewproj', proj='%s') }}"|format(project.project_name)>
    {{project.project_name}}</a>
    </li>
{% else %}
    No projects
{% endfor %}

上面代码的有趣效果是一些“填充?” 添加到链接网址

但是当我想得更多时,我在质疑 url_for 是否在模板中添加了任何值?以下行将为您的锚标记完成同样的事情:

<a href="viewproj/{{ project.project_name }}">{{ project.project_name }}</a> 
于 2012-06-01T17:04:37.050 回答