Подтвердить что ты не робот

Получение параметра запроса в Jinja2

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

http://foo.bar?a=1
4b9b3361

Ответ 1

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

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

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

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

...

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

...

Так, например, чтобы показать параметр запроса "a" в шаблоне:

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

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

Ответ 2

Если вы используете 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() так же, как и что-то еще.

На самом деле это не намного проще.

Update:

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

Предполагая следующую цепочку

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 (т.е. Название/описание/url), который создается путем поиска uri в пользовательской структуре URL-адресов.

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

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

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

{{ a }}

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

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

Ответ 3

Вам нужно будет передать эту информацию в свои шаблоны 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.