Jinja: фильтр urlencode отсутствует?

Созданный на 8 мар. 2011  ·  6Комментарии  ·  Источник: pallets/jinja

Привет,

в списке встроенных фильтров (http://jinja.pocoo.org/docs/templates/#list-of-builtin-filters) я не нашел фильтр "urlencode". Это пропало?

Я не понимаю, в jinja1 этот фильтр существует: http://wsgiarea.pocoo.org/jinja/docs/filters.html

У вас есть комментарий по этому поводу?

С уважением,
Стефан

Самый полезный комментарий

Для тех, кто наткнется на это в поисках фильтра urlencode , он был добавлен еще в 2012 году в 06a8b1c02b2091b31ef4f39ddde3184f25f58260 и 5145401fe5f9995a32757f34359623b87048ab8b. Обсуждение в #85.

Он называется urlencode , а не urlquote , urlquoteplus , urlquote_plus или urlescape (добавляя их для всех, кто приземляется через поиск).

Все 6 Комментарий

почему бы не сделать свой? при его создании постарайтесь понять, как связаны 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 (добавляя их для всех, кто приземляется через поиск).

Была ли эта страница полезной?
0 / 5 - 0 рейтинги