C'est un problème ennuyeux que je rencontre avec Twisted.web. En gros, j'ai une classe qui hérite de twisted.web.resource.Resource
et ajoute quelques éléments par défaut aux modèles Mako :
from twisted.web.resource import Resource
from mako.lookup import TemplateLookup
from project.session import SessionData
from project.security import make_nonce
class Page(Resource):
template = ""
def display(self, request, **kwargs):
session = SessionData(request.getSession())
if self.template:
templates = TemplateLookup(directories=['templates'])
template = templates.get_template(self.template)
return template.render(user=session.user,
info=session.info,
current_path=request.path,
nonce=make_nonce(session),
**kwargs)
else:
return ""
Ensuite, et j'ai réduit le problème à cette petite classe (que j'ai testée), j'écris une ressource qui hérite de Page
:
class Test(pages.Page):
def render_GET(self, request):
return "<form method='post'><input type='submit'></form>"
def render_POST(self, request):
request.redirect("/test")
request.finish()
J'aimerais noter que, dans tous les autres cas. request.finish()
n'est pas la dernière ligne d'une fonction, alors je return
immédiatement après.
Quoi qu'il en soit, j'ajoute cette classe au site à l'adresse suivante /test
et quand j'y navigue, j'obtiens un bouton d'envoi. Je clique sur le bouton d'envoi, et dans la console j'obtiens :
C:\\Python26\\lib\\site-packages\\twisted\\web\\server.py:200: UserWarning: Warning! request.finish called twice.
self.finish()
Mais je n'obtiens ce résultat que la première fois que je soumets la page. Toutes les autres fois, tout va bien. Je devrais simplement ignorer ce problème, mais il me harcèle, et je n'arrive pas à comprendre pourquoi il fait cela, et pourquoi seulement la première fois que la page est soumise. Je n'arrive pas à trouver quoi que ce soit en ligne, et même en laissant tomber les déclarations d'impression et les traces dans le fichier request.finish()
Le code n'a rien révélé.
modifier
Ce matin, j'ai essayé d'ajouter un deuxième request.finish()
à la ressource, et l'erreur ne s'est produite qu'une seule fois. Je suppose qu'il n'avertit qu'une seule fois de la présence d'une ressource - peut-être par exécution du programme ou par session, je ne suis pas sûr. Dans tous les cas, je l'ai changé en :
class Test(pages.Page):
def render_GET(self, request):
return "<form method='post'><input type='submit'></form>"
def render_POST(self, request):
request.redirect("/test")
request.finish()
request.finish()
et j'ai reçu deux messages, en une seule fois. Je n'ai toujours aucune idée de la raison pour laquelle je ne peux pas rediriger la requête sans qu'il dise que je l'ai terminée deux fois (parce que je ne peux pas rediriger sans request.finish()
).