37

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.

Dipesh Bajgain
  • 801
  • 1
  • 10
  • 26
NIlesh Sharma
  • 5,445
  • 6
  • 36
  • 53

3 Answers3

74

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.

Flimm
  • 136,138
  • 45
  • 251
  • 267
Qasim Khan
  • 872
  • 6
  • 4
  • 13
    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. – Aaron Oct 05 '13 at 20:56
  • 1
    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. – uchuugaka Mar 20 '16 at 09:19
64

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

aashah7
  • 2,075
  • 1
  • 17
  • 24
Jon Clements
  • 138,671
  • 33
  • 247
  • 280
  • 6
    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. – Jon Clements Jul 01 '12 at 10:14
  • This really helped me - I needed a Map (or some object) that held the params from a request URL! – Alex Oct 20 '14 at 16:15
59

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.

Flimm
  • 136,138
  • 45
  • 251
  • 267
mynameistechno
  • 3,526
  • 1
  • 37
  • 32