Ошибка сборки с переменными и url_for во Flask - PullRequest
18 голосов
/ 26 января 2012

Нашли в сети одного или двух человек с похожими проблемами, но нигде не увидели решения. Я получаю ошибку сборки из приведенного ниже кода / шаблона, но не могу понять, где проблема или почему она возникает. Похоже, что шаблон не распознает функцию, но не знает, почему это происходит. Любая помощь будет принята с благодарностью - вот уже две ночи стучу по клавиатуре.

Функция:

@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

РЕДАКТИРОВАТЬ: Также хотел бы добавить, что он не распознает переменную "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/

Ответы [ 7 ]

23 голосов
/ 05 апреля 2013

url_for ищет функцию, вы передаете ей имя функции, которую хотите вызвать.Поэтому вы должны использовать:

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

У меня та же проблема.И я решил это согласно: Ошибка колбы: werkzeug.routing.BuildError

19 голосов
/ 26 августа 2014

Только что решил ту же проблему, решение действительно смешное.

Просто добавьте «.» перед именем вашего метода в 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')
1 голос
/ 19 марта 2014

Я все еще отвечаю на это, хотя на него вроде уже ответили.Причина для ясности.Даже прочитав их, я не мог понять, что происходит, не глядя на исходный файл url_for ().

Чистый пример:

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

@app.route('/viewproj/<projname>', methods=['GET','POST'])
def viewproj(proj):
0 голосов
/ 01 июня 2012

Скорее всего, у вас есть несколько перенаправленных функций с именем viewproj.

Кроме того, опубликованный вами вывод не соответствует опубликованному вами коду шаблона. myproject/viewproj?projname=what+up означает, что projname=... было передано url_for(), но ваша функция просмотра ожидает proj=...

0 голосов
/ 01 июня 2012

Я гуглил по той же проблеме и обнаружил это, поэтому я подумал, что выложу то, что у меня получилось, после того, как немного постучал в него (на случай, если кто-нибудь еще приземлится здесь).Похоже, это может быть просто проблема конкатенации строк

Я неправильно "перевел" мой рабочий код:

{% 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> 
0 голосов
/ 27 января 2012

Проверьте, правильно ли разрешается имя проекта.project_name в шаблоне. Правильно ли вы передаете «проекты» в шаблон? Вместо этого жестко закодируйте некоторое значение для 'proj' и посмотрите, как генерируется URL. Что-то вроде: -

<a href="{{ url_for('viewproj', proj='new_project') }}">new project</a>
0 голосов
/ 27 января 2012

Поскольку вы указываете, какие методы доступны в этой конечной точке, я думаю, вам придется передать какой метод вы хотите в url_for.

url_for('viewproj', proj=project.project_name, method='GET')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...