Warum denkt Twisted, dass ich request.finish () zweimal anrufe, wenn ich es nicht bin?

8

Das ist ein nerviges Problem, das ich mit Twisted.web habe. Im Grunde genommen habe ich eine Klasse, die von twisted.web.resource.Resource erbt und Mako-Vorlagen etwas Standardmaterial hinzufügt:

%Vor%

Dann, und ich habe das Problem auf diese kleine Klasse eingegrenzt (die ich getestet habe), schreibe ich eine Ressource, die von Page :

erbt %Vor%

Ich möchte anmerken, dass in allen anderen Fällen, wenn request.finish() nicht die letzte Zeile in einer Funktion ist, ich return unmittelbar danach.

Wie auch immer, ich füge diese Klasse zur Seite bei /test hinzu und wenn ich dort navigiere, erhalte ich eine Submit-Schaltfläche. Ich klicke auf den Submit-Button und in der Konsole bekomme ich:

%Vor%

Aber ich bekomme das NUR das erste Mal, wenn ich die Seite einreiche. Jedes andere Mal ist es in Ordnung. Ich würde das einfach ignorieren, aber es hat mich gequält, und ich kann nicht für das Leben von mir herausfinden, warum es das überhaupt macht, und warum nur das erste Mal, dass die Seite eingereicht wird. Ich kann scheinbar nichts online finden, und selbst das Löschen von Druckanweisungen und Rückverfolgungen im request.finish() Code hat nichts ergeben.

bearbeite

Heute Morgen habe ich versucht, der Ressource eine zweite request.finish() -Linie hinzuzufügen, und es gab mir immer noch nur den Fehler. Ich vermute, es wird nur einmal in einer Ressource darüber warnen - vielleicht pro Durchlauf des Programms oder pro Sitzung, ich bin mir nicht sicher. Auf jeden Fall änderte ich es zu:

%Vor%

und habe nur zwei Nachrichten, einmal. Ich habe immer noch keine Ahnung, warum ich die Anfrage nicht umleiten kann, ohne zu sagen, dass ich sie zweimal beendet habe (weil ich nicht ohne request.finish() umleiten kann).

    
Carson Myers 15.07.2010, 11:09
quelle

1 Antwort

9

Kurze Antwort

Es muss sein:

%Vor%

Lange Antwort

Ich habe beschlossen, einen Twisted-Quellcode zu durchsuchen. Ich habe zuerst einen Traceback zu dem Bereich hinzugefügt, der den Fehler ausgibt, wenn request.finish() zweimal aufgerufen wird:

%Vor% %Vor%

Ich ging rein und checkte render in twisted.web.server aus und fand das:

%Vor%

body ist das Ergebnis des Renderns einer Ressource. Wenn also body ausgefüllt ist, wurde finish im Beispielfall in meiner Frage bereits für dieses Anfrageobjekt aufgerufen (da self übergeben wurde) Diese Methode für die Rendermethode der Ressource).

Aus dem Blick auf diesen Code wird ersichtlich, dass ich durch die Rückgabe von NOT_DONE_YET die Warnung vermeiden würde.

Ich hätte auch die letzte Zeile dieser Methode in

ändern können %Vor%

Um jedoch die Bibliothek nicht zu verändern, lautet die kurze Antwort:

Nach dem Aufruf von request.redirect() müssen Sie request.finish() und dann return twisted.web.server.NOT_DONE_YET

aufrufen

Mehr

Ich habe dazu eine Dokumentation gefunden. Es bezieht sich nicht auf das Umleiten einer Anforderung, sondern auf das Rendern einer Ressource mit request.write() . Es heißt, request.finish() aufzurufen und dann NOT_DONE_YET zurückzugeben. Aus dem Blick auf den Code in render() kann ich sehen, warum das der Fall ist.

    
Carson Myers 16.07.2010, 22:19
quelle

Tags und Links