2012-08-14 4 views
5

Ich bin neu in Twisted und ich habe Probleme mit einigen notwendigen Unterklassen für die static.File in twisted. Ich versuche, Anforderungsheader innerhalb der Unterklasse zu setzen.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() 

Das erste Bit-Code ist die Unterklasse Definition selbst (ziemlich einfach), während das zweite Bit der Initialisierung Teil von meinem Code ist (dies ist nicht alle meine Code). Ich habe auch ein resource.Resource-Objekt namens TestHandler subclassed. WebFolder ist ein weiterer Ordner, der viele statische Dateien enthält.

Allerdings bekomme ich die meisten dieser Arten von Ausnahme beim Aufruf an den Server.

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

Mit vielen anderen Pfaden als root.

Antwort

4

Das Problem in Ihrem Code ist in render_GET Methode. Es gibt nichts zurück. Im Grunde muss es String für synchrone Antwort und NOT_DONE_YET Wert für asynchrone Antwort zurückgeben. In Ihrem Fall render_GET gibt None zurück (und Ihre Verbindung wird sofort geschlossen).

So müssen Sie in Ihrem render_GET (füge richtigen return) eine kleinere Änderung vornehmen:

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

Wenn Sie twisted.web.static.py Modul inspizieren werden Sie feststellen, dass File.render_GET macht Produzenten und gibt NOT_DONE_YET zurück, was die Verbindung so lange festhält, bis sie nicht explizit geschlossen wird (in unserem Fall nach dem Herunterladen der Datei).