2009-04-08 20 views
5

Estoy buscando un servidor de Python HTTP multiproceso bien soportado que admita respuestas de codificación fragmentadas. (Es decir, "Transferencia de codificación: fragmentada" en las respuestas). ¿Para qué sirve la mejor base de servidores HTTP para este fin?Servidor Python HTTP que admite codificación fragmentada?

Respuesta

5

Soportes trenzados chunked transfer encoding (API link) (consulte también el doc API para HTTPChannel). Hay una serie de proyectos de nivel de producción que usan Twisted (por ejemplo, Apple lo usa para el servidor iCalendar en Mac OS X Server), por lo que es bastante compatible y muy robusto.

+0

Gracias, he oído de trenzado, pero mi primera impresión fue que era un peso pesado poco para mi tarea. Voy a echar un segundo vistazo, ya que parece que puedes descargar y ejecutar solo twisted.web sin el resto de las cosas. – slacy

+0

Entiendo tu sensación ... Twisted tiene una gran API, parece un poco culto y tiene una curva de aprendizaje. También me decepcionó inicialmente, pero a veces encuentro que es la herramienta adecuada para el trabajo :-) –

0

Estoy bastante seguro de que los servidores compatibles con WSGI deberían admitir eso. Básicamente, las aplicaciones WSGI devuelven fragmentos iterables, que devuelve el servidor web. No tengo experiencia de primera mano con esto, pero aquí hay un list of compliant servers.

Creo que sería bastante fácil hacer su propia versión, si los servidores WSGI no cumplen con lo que está buscando, usando el built-in CGIHTTPServer de Python. Ya está multiproceso, por lo que dependerá de ti dividir las respuestas.

2

Twisted admite transferencia fragmentada y lo hace de forma transparente. es decir, si el controlador de su solicitud no especifica una longitud de respuesta, Twisted cambiará automáticamente a transferencia fragmentada y generará un fragmento por llamada a Request.write.

0

he conseguido hacerlo utilizando Tornado:

#!/usr/bin/env python 

import logging 

import tornado.httpserver 
import tornado.ioloop 
import tornado.options 
import tornado.web 

from tornado.options import define, options 

define("port", default=8080, help="run on the given port", type=int) 

@tornado.web.stream_request_body 
class MainHandler(tornado.web.RequestHandler): 
    def post(self): 
     print() 
    def data_received(self, chunk): 
     self.write(chunk) 

     logging.info(chunk) 

def main(): 
    tornado.options.parse_command_line() 

    application = tornado.web.Application([ 
     (r"/", MainHandler), 
    ]) 

    http_server = tornado.httpserver.HTTPServer(application) 
    http_server.listen(options.port) 

    tornado.ioloop.IOLoop.current().start() 

if __name__ == "__main__": 
    main() 
Cuestiones relacionadas