2011-03-08 15 views
5

Estoy tratando de configurar un servidor HTTP en una secuencia de comandos de Python. Hasta ahora tengo el servidor para trabajar, con un código similar al de abajo, desde here.Obteniendo variables HTTP GET en Python

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 

class MyHandler(BaseHTTPRequestHandler): 
    def do_GET(self): 
     print("Just received a GET request") 
     self.send_response(200) 
     self.send_header("Content-type", "text/html") 
     self.end_headers() 

     self.wfile.write('Hello world') 

     return 

    def log_request(self, code=None, size=None): 
     print('Request') 

    def log_message(self, format, *args): 
     print('Message') 

if __name__ == "__main__": 
    try: 
     server = HTTPServer(('localhost', 80), MyHandler) 
     print('Started http server') 
     server.serve_forever() 
    except KeyboardInterrupt: 
     print('^C received, shutting down server') 
     server.socket.close() 

Sin embargo, tengo que conseguir variables a partir de la solicitud GET, por lo que si se solicita server.py?var1=hi, necesito el código Python para poner var1 en una variable y procesarla Python (como imprimirlo). ¿Cómo voy a hacer esto? Puede ser una pregunta simple para los profesionales de Python, ¡pero este principiante de Python no sabe qué hacer! ¡Gracias por adelantado!

Respuesta

4

urlparse.parse_qs()

print urlparse.parse_qs(os.environ['QUERY_STRING']) 

O si usted se preocupa por orden o duplicados, urlparse.parse_qsl().

importación en Python 3:from urllib.parse import urlparse

+0

me llegó a través de eso, pero no estoy seguro de cómo integrar esto ... Podría darme un pequeño ejemplo? – BloodPhilia

+0

'urlparse.parse_qs()' devuelve un diccionario. Úselo como lo haría con cualquier otro diccionario en Python. –

+2

Acabo de marcar esta respuesta, y no puedo encontrar dónde BaseHTTPServer establece variables de entorno. CGIHTTPServer lo hace. – samplebias

6

importación urlparse y hacer:

def do_GET(self): 
    qs = {} 
    path = self.path 
    if '?' in path: 
     path, tmp = path.split('?', 1) 
     qs = urlparse.parse_qs(tmp) 
    print path, qs 
+0

Gracias, esto funcionó bien! – BloodPhilia

+4

También se puede aplicar 'parse_qs' a' urlparse (self.path) .query' en lugar de dividir * ruta * manualmente. – mlt