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 laskeys()
método de diccionario estándarkeys()
y la función incorporadalen()
. 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 deFieldStorage
.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...
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.