servidor httpsimpleserver create python http basehttpserver

httpsimpleserver - servidor http python 3



¿Desea analizar los parámetros http GET y POST de BaseHTTPHandler? (5)

¿Has investigado utilizando bibliotecas como CherryPy ? Proporcionan un camino mucho más rápido para manejar estas cosas que BaseHTTPServer.

BaseHTTPHandler del módulo BaseHTTPServer no parece proporcionar ninguna forma conveniente de acceder a los parámetros de solicitud http. ¿Cuál es la mejor manera de analizar los parámetros GET de la ruta y los parámetros POST del cuerpo de la solicitud?

En este momento, estoy usando esto para GET:

def do_GET(self): parsed_path = urlparse.urlparse(self.path) try: params = dict([p.split(''='') for p in parsed_path[4].split(''&'')]) except: params = {}

Esto funciona para la mayoría de los casos, pero me gustaría algo más robusto que maneje las codificaciones y los casos como parámetros vacíos correctamente. Idealmente, me gustaría algo pequeño y autónomo, en lugar de un marco web completo.


El módulo CGI proporciona soporte para parámetros de solicitud HTTP básicos. El mecanismo recomendado para manejar datos de formulario es la clase cgi.FieldStorage .

Para obtener los datos del formulario enviado, es mejor usar la clase FieldStorage . Las otras clases definidas en este módulo se proporcionan principalmente para compatibilidad con versiones anteriores. Instázcalo exactamente una vez, sin argumentos. Esto lee el contenido del formulario desde la entrada estándar o el entorno (dependiendo del valor de las diversas variables de entorno establecidas de acuerdo con el estándar CGI). Ya que puede consumir entrada estándar, debe ser instanciada solo una vez.

La instancia de FieldStorage se puede indexar como un diccionario de Python. Permite la prueba de membresía con el operador in, y también admite las keys() método de diccionario estándar keys() y la función incorporada len() . Los campos de formulario que contienen cadenas vacías se ignoran y no aparecen en el diccionario; para mantener dichos valores, proporcione un valor verdadero para el parámetro opcional de palabra clave keep_blank_values ​​al crear la instancia de FieldStorage .

Por ejemplo, el siguiente código (que asume que el encabezado Content-Type y la línea en blanco ya se han impreso) comprueba que el nombre de los campos y el addr están configurados en una cadena no vacía:

form = cgi.FieldStorage() if "name" not in form or "addr" not in form: print "<H1>Error</H1>" print "Please fill in the name and addr fields." return print "<p>name:", form["name"].value print "<p>addr:", form["addr"].value #...further form processing here...


Es posible que desee utilizar url.parse :

>>> from url.parse import urlparse, parse_qs >>> url = ''http://example.com/?foo=bar&one=1'' >>> parse_qs(urlparse(url).query) {''foo'': [''bar''], ''one'': [''1'']}

Para Python 2 , el módulo se llama urlparse lugar de url.parse .


Mejor solución a una vieja pregunta:

def do_POST(self): length = int(self.headers.getheader(''content-length'')) field_data = self.rfile.read(length) fields = urlparse.parse_qs(field_data)

Esto extraerá los datos POST urlencoded del contenido del documento y los analizará un dictado con urldecoding adecuado


Puede probar los módulos de Werkzeug , la biblioteca base de Werkzeug no es demasiado grande y, si es necesario, puede simplemente extraer este fragmento de código y listo.

El método url_decode devuelve un MultiDict y tiene soporte de codificación :)

A diferencia del método urlparse.parse_qs , la versión de Werkzeug se ocupa de:

  • codificación
  • múltiples valores
  • Orden de clasificación

Si no necesita estos (o en el caso de la codificación, use Python 3), no dude en utilizar las soluciones integradas.