2012-01-26 14 views
14

Hanno trovato una o due persone sul web con problemi simili, ma non ho visto una soluzione pubblicata da nessuna parte. Sto ottenendo un errore di compilazione dal codice/modello di seguito, ma non riesco a capire dove si trova il problema o perché si sta verificando. Sembra che il modello non stia riconoscendo la funzione, ma non sa perché questo si verificherà. Qualsiasi aiuto sarebbe molto apprezzato: mi sono battuto contro la tastiera per due notti.Errore di compilazione con variabili e url_for in Flask

Funzione:

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

...

Estratto Template:

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

log di errore: https://gist.github.com/1684250

EDIT: anche voluto includere che non è il riconoscimento del variabile "proj" quando si costruisce l'URL, quindi io Sto semplicemente aggiungendo il valore come parametro. Ecco un esempio: // mioprogetto/viewproj nomeprogetto = cosa + fino

ultime righe:?

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

Sei, per caso, utilizzando schemi? Esistono altri percorsi definiti per la funzione 'viewproj'? –

+0

No. Sono ancora abbastanza presto - ci sono solo 4 visualizzazioni ciascuna con il proprio percorso – Rob

+0

Prova a rimuovere elementi dal tuo progetto, poco a poco, fino a ridurre il problema a un caso di test minimale. –

risposta

-2

Vedendo come si specifica quali metodi sono disponibili su questo endpoint penso che dovrà passare che metodo che vuoi in url_for.

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

Avevo effettivamente estratto le specifiche e stavo ottenendo lo stesso errore. Sto cercando di specificarlo come "GET" per vedere se questo fa la differenza, ma non sembra essere d'aiuto. – Rob

+0

Ciò causa anche l'aggiunta di method = 'GET' all'URL: //myproject.com/viewproj?projname=what+up&method=GET – Rob

+0

È '_method' non 'metodo'. – sojin

0

Verificare se "project.project_name" si risolve correttamente nel modello. Stai passando 'progetti' correttamente al modello? Hard code un certo valore per 'proj' invece e vedere l'url viene generato. Qualcosa di simile: -

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

Grazie per l'aiuto. Quando passo 'new_project' come stringa costruisce come // myproject/viewproj? Projname = new_project. Ciò implicherebbe che il problema è sul lato vista/percorso? – Rob

+0

Il nome dell'argomento url_for() nel modello non corrisponde alla funzione di visualizzazione. Stai usando 'projname' nel tuo template, non 'proj' come hai definito nella tua vista. Invece di {{url_for ('viewproj', projname = 'new_project')}} usa {{url_for ('viewproj', proj = 'new_project')}}. – sojin

+0

Anche se non è definito, non causerà un errore. – ThiefMaster

-4

Ho cercato su google per lo stesso problema e ho trovato questo, quindi ho pensato di postare cosa ha funzionato per me dopo ho sbattuto a esso per un po '(Nel caso in cui nessun altro è atterrato qui). Sembra che potrebbe essere solo una questione di concatenazione di stringhe

ho avuto modo errato "tradotto" il mio codice di lavoro: "padding"

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

interessante effetto del codice di cui sopra è un po ' aggiunto al link url

Ma come ho pensato di più, mi stavo chiedendo se url_for aggiunge alcun valore nel modello? La seguente linea compirà la stessa cosa per il tag anchor:

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

Questo è semplicemente sbagliato. – ThiefMaster

0

È molto probabile che più di una funzione instradato con il nome viewproj.

Oltre a ciò, l'output pubblicato non corrisponde al codice del modello che hai pubblicato. myproject/viewproj?projname=what+up significa che projname=... è stato passato al url_for(), ma la vostra funzione di visualizzazione aspetta proj=...

22

url_for cerca una funzione, si passa il nome della funzione che si vogliono chiamare. Così si dovrebbe usare:

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

ho avuto lo stesso problema. E ho risolto il problema: Flask error: werkzeug.routing.BuildError

+0

Credo che questa sia la risposta corretta perché ho avuto lo stesso problema. – newguy

1

Rispondo ancora a questo anche se è già stata data una risposta. Il motivo è per chiarezza. Anche dopo averli letti, non riuscivo a capire cosa stesse succedendo senza guardare il file sorgente di url_for().

Un esempio pulito:

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

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

appena risolto lo stesso problema, la soluzione è davvero divertente.

Basta aggiungere un '.' di fronte al nome del tuo metodo in url_for.

Ti piace questa:

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

e dovrebbe funzionare ora.

Il documento per questa soluzione dal pallone viene http://flask.pocoo.org/docs/0.10/api/, e cito:

flask.url_for (endpoint, ** valori) genera un URL per l'endpoint dato con il metodo previsto.

Gli argomenti variabili sconosciuti all'endpoint di destinazione vengono aggiunti all'URL generato come argomenti di query. Se il valore di un argomento di query è Nessuno, l'intera coppia viene saltata. Nel caso in cui i progetti siano attivi, è possibile fare riferimento ai riferimenti di scelta rapida con lo stesso modello prefixando l'endpoint locale con un punto (.).

Questo riferimento alla funzione indice locale al progetto corrente:

url_for('.index') 
+0

Questo è quello di cui avevo bisogno. Tipo di non intuitivo.Immagino che ogni volta che inizi ad avere delle stringhe che si riferiscono ai nomi * delle variabili effettive * come il nome di una funzione, le cose diventano strane. – user3391564

+1

Questo è tutto! Ho davvero dovuto grattarmi la testa con questo .. – Janne

+0

Questo è davvero per me! Stava ottenendo un simile werkzeug.routing.BuildError sulla modalità di chiamata di url_for(). Con un punto (.) Risolve il problema E ha reso l'url relativo corretto! Grazie @ Arthur Wang – Devy