web-dev-qa-db-fra.com

Erreur de build avec les variables et url_for dans Flask

J'ai trouvé une ou deux personnes sur les interwebs avec des problèmes similaires, mais je n'ai vu aucune solution publiée nulle part. Je reçois une erreur de construction du code/modèle ci-dessous, mais je ne peux pas comprendre où est le problème ni pourquoi il se produit. Il semble que le modèle ne reconnaît pas la fonction, mais je ne sais pas pourquoi cela se produirait. Toute aide serait grandement appréciée - cela fait maintenant deux nuits que je me tape contre le clavier.

Fonction:

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

...

Extrait du modèle:

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

Journal des erreurs: https://Gist.github.com/168425

EDIT: Je voulais également inclure qu'il ne reconnaît pas la variable "proj" lors de la construction de l'URL, il s'agit donc simplement d'ajouter la valeur en tant que paramètre. Voici un exemple: // myproject/viewproj? Projname = what + up

Dernières lignes:

[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/
18
Rob

url_for recherche une fonction, vous lui passez le nom de la fonction que vous souhaitez appeler. Vous devez donc utiliser:

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

J'ai le même problème. Et je l'ai résolu en accorant: Erreur de flacon: werkzeug.routing.BuildError

24
atupal

Juste résolu le même problème, la solution est vraiment drôle.

Ajoutez simplement un "." devant le nom de votre méthode dans url_for.

Comme ça:

<a href="{{ url_for('.viewproj', proj=project.project_name) }}">

Et ça devrait marcher maintenant.

Le document pour cette solution de Flask is http://flask.pocoo.org/docs/0.10/api/ , et je cite:

flask.url_for (endpoint, ** values) Génère une URL vers le endpoint donné avec la méthode fournie.

Les arguments variables inconnus du point de terminaison cible sont ajoutés à l'URL générée en tant qu'arguments de requête. Si la valeur d'un argument de requête est None, la paire entière est ignorée. Si les plans sont actifs, vous pouvez raccourcir les références au même plan en préfixant le point de terminaison local avec un point (.).

Cela référencera la fonction d'index local au plan actuel:

url_for('.index')
19
Arthur Wang

Je réponds toujours à cela même si cela a déjà été répondu. La raison est la clarté. Même après les avoir lus, je ne pouvais pas comprendre ce qui se passait sans regarder le fichier source de url_for ().

Un exemple clair:

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

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

Vous avez très probablement plusieurs fonctions routées avec le nom viewproj.

En plus de cela, la sortie que vous avez publiée ne correspond pas au code de modèle que vous avez publié. myproject/viewproj?projname=what+up Signifie que projname=... A été transmis à url_for(), mais votre fonction d'affichage attend proj=...

0
ThiefMaster

Vérifiez si "project.project_name" se résout correctement dans le modèle. Transmettez-vous correctement les "projets" au modèle? Codez en dur une valeur pour 'proj' à la place et voyez que l'url est générée. Quelque chose comme:-

<a href="{{ url_for('viewproj', proj='new_project') }}">new project</a>
0
sojin