Jinja: urlencode filter missing ?

Created on 8 Mar 2011  ·  6Comments  ·  Source: pallets/jinja

Hi,

in List of Builtin Filters (http://jinja.pocoo.org/docs/templates/#list-of-builtin-filters) I don't found "urlencode" filter. It's a missing ?

I don't understand, in jinja1 this filter exists : http://wsgiarea.pocoo.org/jinja/docs/filters.html

Do you have some comment about that ?

Regards,
Stéphane

Most helpful comment

For anyone who stumbles on this looking for a urlencode filter, it was added back in 2012 in 06a8b1c02b2091b31ef4f39ddde3184f25f58260 and 5145401fe5f9995a32757f34359623b87048ab8b. Discussion in #85.

It's called urlencode and not urlquote, urlquoteplus, urlquote_plus or urlescape (adding these for anyone else landing via search).

All 6 comments

why not make your own? while making it, take care to understand how urllib.urlencode, urllib.quote and urllib.quote_plus are related.

for me, i ended up making a function that can be used as both a filter and callable function (done for a flask app):

@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

used in a template as a function:

{% set vendor_url = urlencode('http://www.google.com/search', q=adset.keyword.text) %}

used in a template as a filter:

{% set vendor_url = 'http://www.google.com/search?q=%s' % querytext %}
{{ vendor_url|urlencode }}

why not make your own ?

Because jinja2 have already many buildin filters (http://jinja.pocoo.org/docs/templates/#builtin-filters) and urlencode is a classic feature whose can be appended in builin filters.

Regards,
Stephane

urllib.quote_plus(uri)

Would be nice if this could be committed to the main release. It's something one would expect in a template system as complete as jinja2.

@radekstepan @gfuchedzhy I have the impression that it's not as simple as passing the string/Markup through quote or quote plus. In my case, this caused unicode problems in quote_plus. It seems as if unicode has to be encoded to utf-8 to work well with quote_plus(). Here is my solution:

@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)

For anyone who stumbles on this looking for a urlencode filter, it was added back in 2012 in 06a8b1c02b2091b31ef4f39ddde3184f25f58260 and 5145401fe5f9995a32757f34359623b87048ab8b. Discussion in #85.

It's called urlencode and not urlquote, urlquoteplus, urlquote_plus or urlescape (adding these for anyone else landing via search).

Was this page helpful?
0 / 5 - 0 ratings

Related issues

hvnsweeting picture hvnsweeting  ·  4Comments

Yannik picture Yannik  ·  4Comments

jp-costa picture jp-costa  ·  5Comments

The-Compiler picture The-Compiler  ·  4Comments

guettli picture guettli  ·  5Comments