2012-08-14 15 views
5

Soy nuevo en Twisted y estoy teniendo problemas con algunas subclases necesarias para la static.File in twisted. Estoy tratando de establecer encabezados de solicitud dentro de la subclase.Subclassing static.File

class ResponseFile(static.File): 

    def render_GET(self, request): 
     request.setHeader('Content-Disposition', ['attachment ; filename="tick_db_export.csv"']) 
     static.File.render_GET(self, request) 

if __name__ == "__main__": 
    from twisted.internet import reactor 
    root = ResponseFile('WebFolder') 
    testHandler = TestHandler() 
    root.putChild('main', testHandler) 
    reactor.listenTCP(3650, server.Site(root)) 
    reactor.run() 

El primer bit de código es la definición misma subclase (bastante sencillo), mientras que el segundo bit es la parte de inicialización de mi código (esto no es todo de mi código). También he subclasificado un recurso. Objeto de recurso llamado TestHandler. WebFolder es otra carpeta que contiene muchos archivos estáticos.

Sin embargo, estoy obteniendo la mayoría de estos tipos de excepciones al hacer llamadas al servidor.

Unhandled Error 
Traceback (most recent call last): 
Failure: exceptions.RuntimeError: Producer was not unregistered for/

Con muchas rutas diferentes a la raíz.

Respuesta

4

El problema en su código está en el método render_GET. No devuelve nada. Básicamente debe devolver la cadena para la respuesta síncrona y el valor NOT_DONE_YET para la respuesta asincrónica. En su caso render_GET devuelve None (y su conexión se cierra inmediatamente).

lo que tiene que hacer un cambio más pequeño en su render_GET (añadir adecuado return):

def render_GET(self, request): 
    request.setHeader('Content-Disposition', ['attachment ; filename="tick_db_export.csv"']) 
    return static.File.render_GET(self, request) 

Si inspecciona twisted.web.static.py módulo encontrará que hace File.render_GET productor y devuelve NOT_DONE_YET que hace que la conexión se mantenga hasta que no se cierre explícitamente (en nuestro caso, después de descargar el archivo).

Cuestiones relacionadas