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:
Dann, und ich habe das Problem auf diese kleine Klasse eingegrenzt (die ich getestet habe), schreibe ich eine Ressource, die von Page
:
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:
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.
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:
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).
Es muss sein:
%Vor% 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:
Ich ging rein und checkte render
in twisted.web.server
aus und fand das:
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
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.
Tags und Links python twisted.web