Привет,
в списке встроенных фильтров (http://jinja.pocoo.org/docs/templates/#list-of-builtin-filters) я не нашел фильтр "urlencode". Это пропало?
Я не понимаю, в jinja1 этот фильтр существует: http://wsgiarea.pocoo.org/jinja/docs/filters.html
У вас есть комментарий по этому поводу?
С уважением,
Стефан
почему бы не сделать свой? при его создании постарайтесь понять, как связаны urllib.urlencode, urllib.quote и urllib.quote_plus.
для меня я закончил тем, что создал функцию, которую можно использовать как фильтр, так и вызываемую функцию (сделано для фляжного приложения):
@app.template_filter('urlencode')
def urlencode(uri, **query):
parts = list(urlparse.urlparse(uri))
q = urlparse.parse_qs(parts[4])
q.update(query)
parts[4] = urllib.urlencode(q)
return urlparse.urlunparse(parts)
app.jinja_env.globals['urlencode'] = urlencode
используется в шаблоне как функция:
{% set vendor_url = urlencode('http://www.google.com/search', q=adset.keyword.text) %}
используется в шаблоне как фильтр:
{% set vendor_url = 'http://www.google.com/search?q=%s' % querytext %}
{{ vendor_url|urlencode }}
почему бы не сделать свой?
Потому что в jinja2 уже есть много встроенных фильтров (http://jinja.pocoo.org/docs/templates/#builtin-filters), а urlencode — это классическая функция, которую можно добавить во встроенные фильтры.
С уважением,
Стефан
urllib.quote_plus(uri)
Было бы неплохо, если бы это можно было зафиксировать в основной версии. Это то, чего можно было бы ожидать от такой полной системы шаблонов, как jinja2.
@radekstepan @gfuchedzhy У меня сложилось впечатление, что это не так просто, как передать строку/разметку через цитату или цитату плюс. В моем случае это вызвало проблемы с юникодом в quote_plus. Кажется, что unicode должен быть закодирован в utf-8, чтобы хорошо работать с quote_plus(). Вот мое решение:
@app.template_filter('urlencode')
def urlencode_filter(s):
if type(s) == 'Markup':
s = s.unescape()
s = s.encode('utf8')
s = urllib.quote_plus(s)
return Markup(s)
Для тех, кто наткнется на это в поисках фильтра urlencode
, он был добавлен еще в 2012 году в 06a8b1c02b2091b31ef4f39ddde3184f25f58260 и 5145401fe5f9995a32757f34359623b87048ab8b. Обсуждение в #85.
Он называется urlencode
, а не urlquote
, urlquoteplus
, urlquote_plus
или urlescape
(добавляя их для всех, кто приземляется через поиск).
Самый полезный комментарий
Для тех, кто наткнется на это в поисках фильтра
urlencode
, он был добавлен еще в 2012 году в 06a8b1c02b2091b31ef4f39ddde3184f25f58260 и 5145401fe5f9995a32757f34359623b87048ab8b. Обсуждение в #85.Он называется
urlencode
, а неurlquote
,urlquoteplus
,urlquote_plus
илиurlescape
(добавляя их для всех, кто приземляется через поиск).