Ответ 1
url_for ищет функцию, вы передаете ей имя функции, которую вы хотите вызвать. Поэтому вы должны использовать:
{{ url_for('viewproj', proj=xxx) }}
У меня такая же проблема. И я решил это: Ошибка флешки: werkzeug.routing.BuildError
Найдены один или два человека в сетях с аналогичными проблемами, но не видели решения, размещенные где угодно. Я получаю ошибку сборки из приведенного ниже кода/шаблона, но не могу понять, где эта проблема или почему она происходит. Похоже, что шаблон не распознает функцию, но не знает, почему это произойдет. Любая помощь будет принята с благодарностью - я уже два дня колотил меня против клавиатуры.
Функции:
@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
EDIT: также хотелось включить, что он не распознает переменную "proj" при создании URL-адреса, поэтому просто добавляет значение в качестве параметра. Вот пример: //MyProject/viewproj? PROJNAME = +, что до
Последние несколько строк:
[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/
url_for ищет функцию, вы передаете ей имя функции, которую вы хотите вызвать. Поэтому вы должны использовать:
{{ url_for('viewproj', proj=xxx) }}
У меня такая же проблема. И я решил это: Ошибка флешки: werkzeug.routing.BuildError
Просто решила ту же проблему, решение действительно смешно.
Просто добавьте '.' перед именем вашего метода в url_for.
Вот так:
<a href="{{ url_for('.viewproj', proj=project.project_name) }}">
И теперь он должен работать.
Документ для этого решения из Flask находится http://flask.pocoo.org/docs/0.10/api/, и я цитирую:
flask.url_for (конечная точка, ** значения) Создает URL-адрес для данной конечной точки с предоставленным способом.
Переменные аргументы, которые неизвестны конечной точке назначения, добавляются к сгенерированному URL как аргументы запроса. Если значение аргумента запроса равно None, вся пара пропускается. В случае, если чертежи активны, вы можете сочетать ссылки на один и тот же чертеж, префикс локальной конечной точки точкой (.).
Это будет ссылаться на функцию индекса, локальную для текущей схемы:
url_for('.index')
Я все еще отвечаю на это, хотя на это уже ответил ответ. Причина в ясности. Даже после прочтения их я не мог понять, что происходит, не глядя на исходный файл для url_for().
Чистый пример:
<a href="{{ url_for('viewproj', proj='<projname>') }}">Project name</a>
@app.route('/viewproj/<projname>', methods=['GET','POST'])
def viewproj(proj):
Посмотрите, правильно ли разрешено "project.project_name" в шаблоне. Вы правильно передаете "проекты" в шаблон? Hard code какое-то значение для 'proj' вместо этого и видно, что URL-адрес генерируется. Что-то вроде: -
<a href="{{ url_for('viewproj', proj='new_project') }}">new project</a>
У вас, скорее всего, есть более одной маршрутизируемой функции с именем viewproj
.
Кроме того, вывод, который вы опубликовали, не соответствует коду шаблона, который вы опубликовали. myproject/viewproj?projname=what+up
означает, что projname=...
передано url_for()
, но ваша функция просмотра ожидает proj=...
Увидев, что вы указываете, какие методы доступны в этой конечной точке, я думаю, вам нужно будет передать какой метод вы хотите в url_for.
url_for('viewproj', proj=project.project_name, method='GET')
Я искал ту же проблему и нашел это, поэтому подумал, что буду писать то, что сработало для меня после того, как я немного ударил его (в случае, если кто-то здесь приземлился). Похоже, что это может быть проблема конкатенации строк
Я неправильно "перевел" мой рабочий код:
{% 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
Но поскольку я думал об этом больше, я спрашивал, добавляет ли url_for какое-либо значение в шаблоне? Следующая строка выполнит то же самое для вашего якорного тега:
<a href="viewproj/{{ project.project_name }}">{{ project.project_name }}</a>