Получение параметра запроса в Jinja2 - PullRequest
34 голосов
/ 10 марта 2012

Как получить параметр запроса a в шаблоне Jinja2?

http://foo.bar?a=1

Ответы [ 3 ]

57 голосов
/ 01 июня 2013

Я немного опоздал с этим ответом, но другие решения на самом деле не учитывают использование Flask.

Тот факт, что вы используете Flask с Jinja2, делает вашу ситуацию немного другойиз других рамок.Flask фактически делает некоторые глобальные переменные доступными вам во всех шаблонах Jinja2, не требуя явной передачи их в шаблон.

Цитировать часть документации Flask по http://flask.pocoo.org/docs/templating/#standard-context:

Следующие глобальные переменные доступны в шаблонах Jinja2 по умолчанию:

...

запрос Текущий объект запроса (flask.request)

...

Например, для отображения параметра запроса 'a' в шаблоне:

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

В ссылке на документацию также перечислены другие глобальные переменные, к которым вы можете получить доступ аналогичным образом.

3 голосов
/ 01 июня 2012

Если вы используете webapp2 ...

Параметры запроса можно легко получить, если вы используете webapp2.request как словарь.

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

Чтобы применить образец (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

Если вы хотите просто разобрать строку запроса, просто позвоните:

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

Как только вы соберете свои переменные, просто передайте их в метод jinja2.render_template () так же, как и во всем остальном.

Это действительно не намного легче, чем это.

Обновление:

У меня есть довольно уникальный способ управления параметрами, но я попытаюсь объяснить простую версию.

Предполагая следующую строку запроса

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

Вот как я бы написал обработчик GET:

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)

Итак, реализация, которую я использую, немного отличается. Я также использую параметр _defaults, который передается через маршрутизатор, и параметр _meta (то есть title / description / url), который создается путем поиска uri в пользовательской структуре urls.

В моем базовом обработчике я настраиваю jinja и оборачиваю экземпляр в метод, который проще вызывать (например, render_template). Я не придумал эту идею, я думаю, что получил ее из документов webapp2, но я отвлекся.

Важной частью является параметр 'context'. Вот где вы складываете все данные, которые вы хотите отправить в шаблон. Теперь любое значение, доступное в этом объекте, теперь будет доступно в шаблоне.

Например, вы можете напечатать значение для 'a', используя:

{{ a }}

Если вы передаете массив значений в качестве одного из параметров, вы также можете перечислять их и вызывать конкретные свойства напрямую, используя точечную запись.

Как устроены ваши обработчики, полностью зависит от вас. В отличие от многих платформ, GAE обеспечивает большую гибкость в этом аспекте. То, как я это делаю, требует большого количества наследования, поэтому мне не нужно много повторяться. Немного сложно объяснить более подробно без вставки всего моего handlers.py, но это суть моего базового обработчика, от которого наследуются все остальные мои обработчики. Единственное заметное отличие - я определяю контекст как self.context, чтобы дочерние классы могли получить к нему доступ. Это кажется довольно запутанным в коде, но как только все подключено, добавить страницы / маршруты почти без усилий.

0 голосов
/ 10 марта 2012

Вам нужно будет передать эту информацию вашим шаблонам jinja2, так как это всего лишь шаблонизатор, а не веб-фреймворк.

Части «создания представления» вашей веб-инфраструктуры, которая имеет дело с запросами, обычно передается некоторая информация заголовка HTTP-запроса или структура данных. это часто включает параметры запроса. Если это так, то вы можете просто передать это в свой шаблон.

Даже если полученная вами информация заголовка не включает параметры запроса, она всегда будет содержать URL. Когда у вас есть URL в коде функции представления, вы можете сделать что-то вроде этого:

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'}

Затем вы можете отправить этот request_params словарь в свой шаблон jinja.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...