2012-01-26 18 views
14

Znaleźliśmy jedną lub dwie osoby w interwebs z podobnymi problemami, ale nigdzie nie widziałem rozwiązania. Otrzymuję błąd kompilacji z poniższego kodu/szablonu, ale nie mogę ustalić, gdzie jest problem i dlaczego się pojawia. Wygląda na to, że szablon nie rozpoznaje funkcji, ale nie wiadomo, dlaczego tak się stało. Jakakolwiek pomoc byłaby bardzo doceniona - od dwóch nocy biję mnie o klawiaturę.Błąd kompilacji ze zmiennymi i url_for w Flask

Funkcja:

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

...

Szablon Fragment:

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

dziennika błędu: https://gist.github.com/1684250

EDIT: Również chciałem to, że nie uznająca Zmienna "proj" podczas budowania adresu URL, więc i t po prostu dodaje wartość jako parametr. Oto przykład: // myproject/viewproj projname = co + w górę

ostatnich kilku linii:

[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

jesteś, przypadkiem, wykorzystując plany? Czy są jakieś inne trasy zdefiniowane dla funkcji 'viewproj'? –

+0

Nie. Nadal jestem dość wcześnie - są tylko 4 widoki z własną trasą. – Rob

+0

Spróbuj usunąć elementy z projektu, krok po kroku, dopóki nie zmniejszysz problemu do minimalnego przypadku testowego. –

Odpowiedz

-2

widząc, jak określić, które metody są dostępne na tym końcowym myślę, że będzie musiał przejść, które metoda, którą chcesz umieścić w url_for.

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

W rzeczywistości wyciągnąłem specyfikację i otrzymałem ten sam błąd. Zastanawiam się nad określeniem go jako "GET", aby zobaczyć, czy to robi różnicę, ale wydaje się, że nie pomaga. – Rob

+0

Powoduje to również, że metoda = "GET" do adresu url: //myproject.com/viewproj?projname=what+up&method=GET – Rob

+0

To "metoda", a nie "metoda". – sojin

0

Sprawdź, czy "project.project_name" poprawnie rozwiązuje się w szablonie. Czy poprawnie przekazujesz "projekty" do szablonu? Zamiast tego napisz trochę o wartości "proj" i zobacz, jak generowany jest URL. Coś jak: -

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

Dzięki za pomoc. Kiedy przekazuję "new_project" jako ciąg znaków, buduje on jako // myproject/viewproj? Projname = new_project. Czy to oznacza, że ​​problem leży po stronie widoku/routingu? – Rob

+0

Twoja nazwa argumentu url_for() w szablonie nie jest zgodna z funkcją widoku. Używasz "projname" w swoim szablonie, a nie "proj", jak zdefiniowałeś w swoim widoku. tj. zamiast {{url_for ('viewproj', projname = 'new_project')}} użyj {{url_for ('viewproj', proj = 'new_project')}}. – sojin

+0

Nawet jeśli jest niezdefiniowany, nie spowoduje błędu. – ThiefMaster

-4

google na ten sam problem i okazało się to, więc pomyślałem, że po co pracował dla mnie po tym, jak uderzył w niego przez chwilę (jeżeli ktoś wylądował tutaj). Wygląda na to może być tylko kwestia ciąg konkatenacji

miałem nieprawidłowo „tłumaczone jako” mój kod roboczy: „wyściółka”

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

ciekawy efekt kodu powyżej jest pewne dodany do adresu URL

Ale jak myślałem o tym więcej, zastanawiałem się, czy adres url dodaje jakieś wartości w szablonie? Poniższa linia będzie osiągnąć to samo dla taga:

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

To jest po prostu złe. – ThiefMaster

0

Najprawdopodobniej mieć więcej niż jedną funkcję kierowane z nazwą viewproj.

Poza tym wysłane wyniki nie są zgodne z opublikowanym kodem szablonu. myproject/viewproj?projname=what+up oznacza, że ​​projname=... został przekazany do url_for(), ale czynność widok spodziewa proj=...

22

url_for szuka funkcji, przekazać to nazwa funkcji, którą chce się połączyć. Powinieneś użyć:

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

Mam ten sam problem. I rozwiązałem go pod kątem: Flask error: werkzeug.routing.BuildError

+0

Uważam, że jest to poprawna odpowiedź, ponieważ mam ten sam problem. – newguy

1

Nadal odpowiadam na to, mimo że już zostało udzielone. Powód jest dla jasności. Nawet po ich przeczytaniu nie mogłem zrozumieć, co się dzieje, nie patrząc na plik źródłowy dla url_for().

Czysty przykład:

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

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

Wystarczy rozwiązać ten sam problem, rozwiązanie jest naprawdę zabawne.

Po prostu dodaj "." przed nazwą metody w url_for.

Jak to:

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

i powinno działać teraz.

Dokument do tego roztworu z kolby http://flask.pocoo.org/docs/0.10/api/, cytuję:

flask.url_for (punkt końcowy, ** wartości) generuje URL do danego punktu końcowego z metodą przewidzianą.

Zmienne zmienne, które nie są znane docelowemu punktowi końcowemu, są dodawane do wygenerowanego adresu URL jako argumenty zapytania. Jeśli wartością argumentu zapytania jest Brak, cała para zostanie pominięta. W przypadku, gdy projekty są aktywne, możesz skrócić odniesienia do tego samego projektu, dodając prefiks lokalnego punktu końcowego kropką (.).

To będzie odwoływać się do funkcji indeksu lokalnego do aktualnego planu:

url_for('.index') 
+0

Tego właśnie potrzebowałem. Rodzaj nieintuicyjny.Domyślam się, że gdy zaczynasz mieć ciągi, odwołuj się do rzeczywistych nazw zmiennych * jak nazwa funkcji, sprawy stają się dziwne. – user3391564

+1

To jest to! Naprawdę musiałem podrapać się w głowę tym .. – Janne

+0

To jest rzeczywiście dla mnie! Otrzymywanie podobnego werkzeug.routing.BuildError po wywołaniu funkcji url_for(). Za pomocą kropki (.) Rozwiązuje problem ORAZ renderuje poprawny względny URL! Dziękuję @ Arthur Wang – Devy

Powiązane problemy