这是我在使用 Twisted.web 时遇到的一个烦人的问题。基本上,我有一个继承自twisted.web.resource.Resource
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 ""
然后,我将问题缩小到这个小类(我测试过),我编写了一个继承自的资源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()
我想指出,在所有其他情况下,如果request.finish()
不是函数中的最后一行,那么我return
会立即执行它。
无论如何,我将这个类添加到网站,/test
当我在那里导航时,我得到一个提交按钮。我单击提交按钮,在控制台中我得到:
C:\Python26\lib\site-packages\twisted\web\server.py:200:用户警告:警告!request.finish 调用了两次。 self.finish()
但是,我只有在第一次提交页面时才得到这个。每隔一段时间就好了。我会忽略这一点,但它一直在唠叨我,我一生都无法弄清楚它为什么会这样做,以及为什么只有第一次提交页面。我似乎在网上找不到任何东西,甚至在request.finish()
代码中删除打印语句和回溯也没有透露任何内容。
编辑
今天早上我尝试在资源中添加第二request.finish()
行,但它仍然只给了我一次错误。我想它只会在资源中警告它一次——也许每次运行程序,或者每次会话,我不确定。无论如何,我将其更改为:
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()
刚收到两条消息,一次。我仍然不知道为什么我不能在没有它说我完成了两次的情况下重定向请求(因为我不能没有重定向request.finish()
)。