2012-03-10 21 views
24

W jaki sposób można uzyskać żądanie o parametrze a w szablonie Jinja2?Uzyskiwanie parametru żądania w Jinja2

http://foo.bar?a=1 
+1

Z jakich frameworków korzystasz w Jinja2? –

+0

Kolba. Ale chcę pobrać ten parametr w szablonie (.html), a nie w pliku .py. @DevinM –

Odpowiedz

43

Trochę się spóźniłem z tą odpowiedzią, ale inne rozwiązania nie odpowiadają za wykorzystanie Flask.

Fakt, że używasz Flask z Jinja2, sprawia, że ​​Twoja sytuacja jest trochę inna niż w innych frameworkach. Flask w rzeczywistości udostępnia niektóre zmienne globalne dla wszystkich szablonów Jinja2 bez konieczności bezpośredniego przekazywania ich do szablonu.

Aby zacytować część dokumentacji kolbie w http://flask.pocoo.org/docs/templating/#standard-context:

następujące zmienne globalne są dostępne w szablonach Jinja2 domyślnie:

...

prośba Obecny wniosek przedmiot (flask.request)

...

Tak na przykład, aby pokazać wartość parametru żądanie „a” w szablonie:

{{ request.args.get('a') }} 

Link dokumentacja wymienia także inne zmienne globalne można uzyskać dostęp w podobny sposób.

0

Będziesz musiał przekazać tę informację do szablonów jinja2, ponieważ jest to tylko silnik szablonów, a nie ramy internetowej.

"Część generowania podglądu" w twojej strukturze sieciowej, która zajmuje się żądaniami, zwykle jest przekazywana jako informacja nagłówkowa lub struktura danych żądania HTTP. często obejmuje to parametry żądania. Jeśli tak, to możesz po prostu przekazać to do swojego szablonu.

Nawet jeśli informacje w nagłówku, które otrzymasz, nie zawierają parametrów żądań, zawsze będą zawierały adres URL. Gdy masz url w widoku kodu funkcji, można zrobić coś takiego:

url = "http://foo.bar?a=1&b=2&c=true" # actually get this from your http request header 
import urlparse 
split_result = urlparse.urlsplit(url) 
request_params = dict(urlparse.parse_qsl(split_result.query)) 
# request_params = {'a': '1', 'b': '2', 'c': 'true'} 

Następnie można wysłać ten słownik request_params do szablonu jinja.

+0

Jednak wiele kontrolerów używa tego samego szablonu. Tak więc muszę to zrobić na wszystkich kontrolerach, kiedy mogłem zrobić tylko jeden raz w szablonie =/ –

+1

W zależności od twojej struktury sieciowej, może on obsługiwać system typu "middleware", który owija twoje widoki lub inne warstwy. Oznaczałoby to, że przed funkcją widoku parametry żądania są wyodrębniane przez niestandardowe oprogramowanie pośrednie, a po funkcji widoku te parametry żądania są automatycznie dołączane do szablonu jinja. Nawet jeśli nie ma takiego mechanizmu, można łatwo zrobić coś podobnego z dekoratorami. Większość aplikacji internetowych obsługuje oprogramowanie pośrednie, ponieważ jest to centralna koncepcja WSGI. –

+1

Ale jak pobrać ten parametr w szablonie (.html)? To jest możliwe? –

3

Jeśli używasz webapp2 ...

Parametry kwerendy mogą być pobierane z łatwością, jeśli używasz webapp2.request jak słownik.

webapp2.request.get('[parameter]', '[optionalDefaultValue]') 

Aby zastosować próbkę (http://foo.bar?a=1 & b = 2 & c = true):

a = webapp2.request.get('a') # a = 1 
b = webapp2.request.get('b') # b = 2 
c = webapp2.request.get('c') # c = true, may need further parsing to make it bool 

Jeśli chcesz po prostu ciągu kwerendy un-analizowany tylko zadzwoń:

qstring = webapp2.request.query_string 
# qstring = '?a=1&b=2&c=true 

po zebraniu zmienne tylko przekazać je do metody jinja2.render_template() to samo jak byś cokolwiek innego.

To naprawdę nie jest dużo prostsze.

Aktualizacja:

mam dość unikalny sposób zarządzania parametrami, ale postaram się wyjaśnić prostą wersję.

Zakładając następujące ciągu kwerendy

http://foo.bar?a=1&b=2&c=true 

Oto jak bym napisać procedurę obsługi otrzymujemy:

class BaseHandler(webapp2.RequestHandler): 
    def jinja2(self): 
    return jinja2.get_jinja2(app=self.app) 

    def render_template(self, template, **context): 
    self.response.write(self.jinja2.render_template(template, **context)) 

    def get(self, **params): 
    context = {}  
    context['a'] = webapp2.request.get('a') 
    context['b'] = webapp2.request.get('b') 
    context['c'] = webapp2.request.get('c') 
    self.render_template([template], **context) 

więc realizacja używam jest trochę inna. Używam również parametru _defaults, który jest przekazywany za pośrednictwem routera, oraz parametru _meta (tj. Title/description/url), który jest tworzony przez wybranie uri na niestandardowej strukturze adresów URL.

W moim podstawowym programie obsługi ustawiam jinja i owijam instancję metodą łatwiejszą do wywołania (np. Render_template). Nie wpadłem na ten pomysł, myślę, że dostałem go z dokumentacji webapp2, ale dygresja.

Ważną częścią jest parametr "kontekst". Właśnie tam układasz wszystkie dane, które chcesz przesłać do szablonu. Teraz dowolna wartość dostępna w tym obiekcie będzie teraz dostępna w szablonie.

Na przykład można wydrukować wartość „a” przy użyciu:

{{ a }} 

Jeśli przechodzą w tablicy wartości jako jeden z parametrów można również wyliczyć przez nich i nazywają specyficzne właściwości bezpośrednio za pomocą kropki notacja.

Sposób, w jaki twoja usługa obsługi transakcji jest zorganizowana, zależy wyłącznie od Ciebie. W przeciwieństwie do wielu frameworków, GAE zapewnia dużą elastyczność w tym aspekcie. Sposób, w jaki to robię, wymaga dużej ilości dziedziczenia, więc nie muszę wiele powtarzać. Jest to trochę trudne do wyjaśnienia z większą szczegółowością bez wklejenia całego mojego handlers.py, ale jest to sedno mojego podstawowego programu obsługi, którego dziedziczą wszyscy reszta moich opiekunów. Jedyną zauważalną różnicą jest zdefiniowanie kontekstu jako self.context, aby klasy podrzędne mogły uzyskać do niego dostęp. Wydaje się to dość zawiłe w kodzie, ale gdy wszystko jest już podłączone, prawie bez wysiłku dodaje się dodatkowe strony/trasy.

+1

Ale jak pobrać ten parametr w szablonie (.html)? To jest możliwe? –

+0

@ShankarCabus Nie, przekazujesz parametry do szablonu z Pythona. Zaktualizowałem swoją odpowiedź, aby zilustrować, w jaki sposób. –