2009-04-08 9 views

Répondre

5

Supports torsadés chunked transfer encoding (API link) (voir également le document API pour HTTPChannel). Il existe un certain nombre de projets de production utilisant Twisted (par exemple, Apple l'utilise pour le serveur iCalendar sous Mac OS X Server), il est donc très bien supporté et très robuste. Twisted prend en charge le transfert en blocs et il le fait de manière transparente.

+0

Merci, je l'ai entendu parler de Twisted, mais ma première impression était qu'il était un poids lourd de peu pour ma tâche. Je vais jeter un second coup d'œil, car il semble que vous pouvez télécharger et lancer simplement twisted.web sans le reste des choses. – slacy

+0

Je comprends votre sentiment ... tordu a une grosse API, semble un peu sectaire et a une certaine courbe d'apprentissage. Cela m'a d'abord découragé, mais parfois je trouve que c'est le bon outil pour le travail :-) –

0

Je suis presque sûr que les serveurs compatibles WSGI devraient prendre en charge cela. Essentiellement, les applications WSGI renvoient des blocs itératifs, renvoyés par le serveur Web. Je n'ai pas d'expérience de première main avec ceci, mais voici un list of compliant servers.

Je devrais penser qu'il serait assez facile de rouler le vôtre, si les serveurs WSGI ne répondent pas à ce que vous cherchez, en utilisant le CGIHTTPServer intégré de Python. Il est déjà multithread, donc ce serait juste à vous de partager les réponses.

2

c'est-à-dire que si votre gestionnaire de requêtes ne spécifie pas de longueur de réponse, Twisted passera automatiquement au transfert par blocs et générera un bloc par appel à Request.write.

0

j'ai réussi à le faire en utilisant 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() 
Questions connexes