40

I need to get the query string from this URL https://stackoverflow.com/questions/ask?next=1&value=3 and I don't want to use request.META. I have figured out that there are two more ways to get the query string:

  1. Using urlparse urlparse.urlparse(url).query

  2. Using url encode Use urlencode and pass the request.GET params dictionary into it to get the string representation.

So which way is better? My colleagues prefer urlencode but have not provided a satisfying explanation. They claim that urlparse calls urlencode internally which is something I'm not sure about since urlencode lives in the urllib module.

4 Answers 4

78

You can make Query string using GET parameters like this

request.GET.urlencode()

This does not include the ? prefix, and it may not return the keys in the same order as in the original request.

Sign up to request clarification or add additional context in comments.

5 Comments

It's important to note that since QueryDict wraps an unordered dictionary, request.GET.urlencode() may not return keys in the same order that they appear in the original request URI.
That's a fundamental of dictionaries actually. Additionally, most query strings should be considered unordered if they are keyed. If it is a true list it will be ordered.
For template usage, the syntax would be like this ` <a href="{{ request.path }}?{{ request.GET.urlencode }}">Link with all URL parameters</a> `
@uchuugaka This is no longer true since Python 3.7, insertion order is always remembered for dict keys now.
mmm ok. I wrote that in 2016
66

Third option:

>>> from urlparse import urlparse, parse_qs
>>> url = 'http://something.com?blah=1&x=2'
>>> urlparse(url).query
'blah=1&x=2'
>>> parse_qs(urlparse(url).query)
{'blah': ['1'], 'x': ['2']}

In Python 3+ this is available as:

from urllib.parse import parse_qs

Documentation for urllib.parse

3 Comments

Okay, not quite sure why you'd want the query string and not have it processed, but using urlparse is the most readable and understandable way.
This really helped me - I needed a Map (or some object) that held the params from a request URL!
This is very useful when you're not getting the URL from a request. In my case I had to parse pagination URLs that came from an external API response.
60

I prefer using

request.META['QUERY_STRING']

From docs:

https://docs.djangoproject.com/en/stable/ref/request-response/#django.http.HttpRequest.META

This does not include the ? prefix.

Comments

1

Additional information for the accepted answer

For template usage, the syntax would be something like this

<a href="{{ request.path }}?{{ request.GET.urlencode }}">Link with all URL parameters</a>

Alternative is using custom filter

https://stackoverflow.com/a/24135527/417899

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.