2012-08-14 13 views
5

Sono nuovo di Twisted e sto avendo problemi con alcune sottoclassi necessarie per lo static. File in twisted. Sto provando a impostare le intestazioni delle richieste all'interno della sottoclasse.Sottoclasse statica.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() 

Il primo bit del codice è la definizione stessa sottoclasse (piuttosto semplice), mentre il secondo bit è la porzione di inizializzazione dal mio codice (questo non è tutto il mio codice). Ho anche sottoclassato una risorsa. Oggetto risorsa chiamato TestHandler. WebFolder è un'altra cartella contenente molti file statici.

Tuttavia, sto ricevendo la maggior parte di questi tipi di eccezione quando si effettuano chiamate al server.

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

Con molti percorsi diversi diversi da root.

risposta

4

Il problema nel codice è nel metodo render_GET. Non restituisce nulla. Fondamentalmente deve restituire la stringa per la risposta sincrona e il valore NOT_DONE_YET per la risposta asincrona. Nel tuo caso render_GET restituisce None (e la tua connessione si chiude immediatamente).

quindi bisogna fare un cambiamento più piccolo nella vostra render_GET (aggiungi corretta return):

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

Se si controlla twisted.web.static.py modulo che troverete che File.render_GET fa il produttore e restituisce NOT_DONE_YET che rende la connessione in attesa fino a quando non viene chiusa esplicitamente (nel nostro caso, dopo il download del file).