web-dev-qa-db-fra.com

Le meilleur moyen d'obtenir une chaîne de requête à partir d'une URL en python?

Je dois obtenir la chaîne de requête à partir de cette URL https://stackoverflow.com/questions/ask?next=1&value=3 et je ne souhaite pas utiliser request.META . J'ai découvert qu'il y avait deux autres moyens d'obtenir la chaîne de requête:

  1. Utilisation de urlparse Urlparse.urlparse (url) .query

  2. Utilisation de l'URL encoder Utilisez urlencode et transmettez-y le dictionnaire request.GET params pour obtenir la représentation sous forme de chaîne.

Alors, quelle est la meilleure? Mes collègues préfèrent le code URL mais n’ont pas fourni d’explication satisfaisante. Ils affirment que urlparse appelle urlencode en interne, ce dont je ne suis pas sûr, car je ne suis pas sûr, puisque urlencode réside dans le module urllib.

24
NIlesh Sharma

Vous pouvez créer une chaîne de requête en utilisant des paramètres GET comme celui-ci

request.GET.urlencode()

Cela n'inclut pas le préfixe ? et ne peut pas renvoyer les clés dans le même ordre que dans la demande d'origine.

44
Qasim Khan

Troisième 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']}

En Python 3+, cela est disponible en tant que:

from urllib.parse import parse_qs

Documentation pour urllib.parse

56
Jon Clements

Je préfère utiliser

request.META['QUERY_STRING']

De docs:

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

Cela n'inclut pas le préfixe ?.

35
mynameistechno

vous pouvez également utiliser request.arg aussi

if 'next' in request.arg and 'values' in request.arg:
    next = request.arg.get('next', '')
    value = request.arg.get('value', '')
1
SR_Mehta