Recuperando parámetros de una URL

Dada una URL como la siguiente, ¿cómo puedo analizar el valor de los parámetros de consulta? Por ejemplo, en este caso quiero el valor de def .

 /abc?def='ghi' 

Estoy usando Django en mi entorno; ¿Hay algún método en el objeto de request que pueda ayudarme?

Intenté usar self.request.get('def') pero no está devolviendo el valor ghi como esperaba.

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] 

Estoy sorprendido de que esta solución no esté aquí ya. Utilizar:

 request.GET.get('variable_name') 

Esto “obtendrá” la variable del diccionario “GET” y devolverá el valor ‘nombre_variable’ si existe, o un objeto Ninguno si no existe.

para 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] 

Sé que esto es un poco tarde, pero como hoy me encontré aquí, pensé que esta podría ser una respuesta útil para otros.

 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 

Con parse_qsl (), “los datos se devuelven como una lista de nombres, pares de valores”.

Hay una nueva biblioteca llamada furl. Me parece que esta biblioteca es la más pythonica para hacer álgebra url. Instalar:

 pip install furl 

Código:

 from furl import furl f = furl("/abc?def='ghi'") print f.args['def'] 

La url a la que hace referencia es un tipo de consulta y veo que el objeto de solicitud admite un método denominado argumentos para obtener los argumentos de la consulta. También es posible que desee probar self.request.get('def') directamente para obtener su valor del objeto.

 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) 

Espero que esto ayude

El módulo urlparse proporciona todo lo que necesitas:

urlparse.parse_qs ()

No hay necesidad de hacer nada de eso. Solo con

 self.request.get('variable_name') 

Tenga en cuenta que no estoy especificando el método (GET, POST, etc.). Esto está bien documentado y este es un ejemplo.

El hecho de que use las plantillas de Django no significa que el controlador también sea procesado por Django

En puro 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] 
 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 

Hay una bonita biblioteca w3lib.url

 from w3lib.url import url_query_parameter url = "/abc?def=ghi" print url_query_parameter(url, 'def') ghi 

Por cierto, tuve problemas al usar parse_qs () y al obtener parámetros de valores vacíos y aprendí que tiene que pasar un segundo parámetro opcional ‘keep_blank_values’ para devolver una lista de los parámetros en una cadena de consulta que no contiene valores. El valor predeterminado es falso. Algunas API escritas de mala calidad requieren que los parámetros estén presentes, incluso si no contienen valores

 for k,v in urlparse.parse_qs(p.query, True).items(): print k