route example app python flask werkzeug build-error url-for

python - app - flask post example



Error de compilación con variables y url_for en Flask (7)

Busqué en Google el mismo problema y encontré esto, así que pensé en publicar lo que funcionó para mí después de golpearlo un poco (en caso de que alguien más haya aterrizado aquí). Parece que puede ser solo un problema de concatenación de cadenas

Tuve incorrectamente "traducido" mi código de trabajo:

{% 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 %}

El efecto interesante del código anterior es algún "relleno". añadido a la url del enlace

Pero a medida que pensaba más en ello, me preguntaba si url_for agrega algún valor en la plantilla. La siguiente línea logrará lo mismo para su etiqueta de anclaje:

<a href="viewproj/{{ project.project_name }}">{{ project.project_name }}</a>

He encontrado a una o dos personas en las redes con problemas similares, pero no he visto una solución publicada en ninguna parte. Recibo un error de compilación del código / plantilla a continuación, pero no puedo averiguar dónde está el problema o por qué está ocurriendo. Parece que la plantilla no reconoce la función, pero no sabe por qué ocurrirá esto. Cualquier ayuda sería muy apreciada, ya que me han estado golpeando contra el teclado durante dos noches.

Función:

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

...

Extracto de la plantilla:

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

Registro de errores: https://gist.github.com/1684250

EDITAR: También quise incluir que no está reconociendo la variable "proj" al crear la URL, así que solo está agregando el valor como un parámetro. Aquí hay un ejemplo: // myproject / viewproj? Projname = what + up

Últimas líneas:

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


Lo más probable es que tenga más de una función enrutada con el nombre viewproj .

Además de eso, la salida que publicaste no corresponde con el código de la plantilla que publicaste. myproject/viewproj?projname=what+up significa que projname=... se pasó a url_for() , pero su función de visualización espera proj=...


Solo resuelto el mismo problema, la solución es realmente divertida.

Simplemente añada un ''.'' delante de su nombre de método en url_for.

Me gusta esto:

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

Y debería funcionar ahora.

El documento para esta solución de Flask es http://flask.pocoo.org/docs/0.10/api/ , y cito:

flask.url_for (endpoint, ** valores) Genera una URL para el endpoint dado con el método proporcionado.

Los argumentos variables que son desconocidos para el punto final de destino se agregan a la URL generada como argumentos de consulta. Si el valor de un argumento de consulta es Ninguno, se omite todo el par. En caso de que los planos estén activos, puede hacer un acceso directo a las referencias al mismo anteproyecto prefijando el punto final local con un punto (.).

Esto hará referencia a la función de índice local del plano actual:

url_for(''.index'')


Todavía respondo a esto a pesar de que ya ha sido respondido. La razón es por claridad. Incluso después de leerlos, no podía entender lo que estaba pasando sin mirar el archivo fuente de url_for ().

Un ejemplo limpio:

<a href="{{ url_for(''viewproj'', proj=''<projname>'') }}">Project name</a> @app.route(''/viewproj/<projname>'', methods=[''GET'',''POST'']) def viewproj(proj):


Vea si ''project.project_name'' se está resolviendo correctamente en la plantilla. ¿Estás pasando ''proyectos'' correctamente a la plantilla? Codifique algo de valor para ''proj'' en su lugar y vea cómo se genera la URL. Algo como:-

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


Viendo a medida que especifica qué métodos están disponibles en ese punto final, creo que tendrá que pasar el método que desee a url_for.

url_for(''viewproj'', proj=project.project_name, method=''GET'')


url_for busca una función, le pasa el nombre de la función a la que desea llamar. Así que debes usar:

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

Tengo el mismo problema. Y lo resolví accoring: Flask error : werkzeug.routing.BuildError