Étant donné une URL comme celle-ci, comment puis-je analyser la valeur des paramètres de requête? Par exemple, dans ce cas, je veux la valeur de def
.
/abc?def='ghi'
J'utilise Django dans mon environnement; existe-t-il une méthode sur l'objet request
qui pourrait m'aider?
J'ai essayé d'utiliser self.request.get('def')
mais il ne renvoie pas la valeur ghi
comme je l'espérais.
Python 2:
import urlparse
url = 'http://foo.appspot.com/abc?def=ghi'
parsed = urlparse.urlparse(url)
print urlparse.parse_qs(parsed.query)['def']
Python 3:
import urllib.parse as urlparse
url = 'http://foo.appspot.com/abc?def=ghi'
parsed = urlparse.urlparse(url)
print(urlparse.parse_qs(parsed.query)['def'])
import urlparse
url = 'http://example.com/?q=abc&p=123'
par = urlparse.parse_qs(urlparse.urlparse(url).query)
print par['q'][0], par['p'][0]
Je suis choqué que cette solution ne soit pas déjà là. Utilisation:
request.GET.get('variable_name')
Cela "obtiendra" la variable du dictionnaire "GET" et renverra la valeur 'nom_variable' s'il existe ou un objet Aucun s'il n'existe pas.
pour Python> 3.4
from urllib import parse
url = 'http://foo.appspot.com/abc?def=ghi'
query_def=parse.parse_qs(parse.urlparse(url).query)['def'][0]
Je sais que c'est un peu tard, mais comme je me suis retrouvé ici aujourd'hui, j'ai pensé que cela pourrait être une réponse utile pour les autres.
import urlparse
url = 'http://example.com/?q=abc&p=123'
parsed = urlparse.urlparse(url)
params = urlparse.parse_qsl(parsed.query)
for x,y in params:
print "Parameter = "+x,"Value = "+y
Avec parse_qsl (), "Les données sont renvoyées sous forme de liste de paires nom/valeur."
Il existe une nouvelle bibliothèque appelée furl. Je trouve cette bibliothèque très pythonique pour faire de l’algèbre d’URL. À installer:
pip install furl
Code:
from furl import furl
f = furl("/abc?def='ghi'")
print f.args['def']
L'URL que vous faites référence est un type de requête et je vois que l'objet de requête prend en charge une méthode appelée arguments pour obtenir les arguments de la requête. Vous pouvez également vouloir essayer self.request.get('def')
directement pour obtenir votre valeur de l'objet.
En pur Python:
def get_param_from_url(url, param_name):
return [i.split("=")[-1] for i in url.split("?", 1)[-1].split("&") if i.startswith(param_name + "=")][0]
Le module urlparse fournit tout ce dont vous avez besoin:
urlparse.parse_qs ()
Il n'y a pas besoin de faire quoi que ce soit. Seulement avec
self.request.get('variable_name')
Notez que je ne spécifie pas la méthode (GET, POST, etc.). Ceci est bien documenté et ceci est un exemple
Le fait que vous utilisiez Django templates ne signifie pas que le gestionnaire est également traité par Django
def getParams(url):
params = url.split("?")[1]
params = params.split('=')
pairs = Zip(params[0::2], params[1::2])
answer = dict((k,v) for k,v in pairs)
J'espère que cela t'aides
import cgitb
cgitb.enable()
import cgi
print "Content-Type: text/plain;charset=utf-8"
print
form = cgi.FieldStorage()
i = int(form.getvalue('a'))+int(form.getvalue('b'))
print i
Il y a une belle bibliothèque w3lib.url
from w3lib.url import url_query_parameter
url = "/abc?def=ghi"
print url_query_parameter(url, 'def')
ghi
Btw, j'avais des problèmes en utilisant parse_qs () et obtenir des paramètres de valeur vide et appris que vous devez passer un deuxième paramètre optionnel 'keep_blank_values' pour renvoyer une liste des paramètres dans une chaîne de requête qui ne contient aucune valeur. La valeur par défaut est false. Certaines API écrites merdiques nécessitent la présence de paramètres même si elles ne contiennent aucune valeur
for k,v in urlparse.parse_qs(p.query, True).items():
print k