简短的回答
request.redirect("/test")
request.finish()
return twisted.web.server.NOT_DONE_YET
冗长的回答
我决定去筛选一些扭曲的源代码。我首先在打印错误的区域添加了一个回溯,如果
request.finish()
def finish(self):
import traceback #here
"""
Indicate that all response data has been written to this L{Request}.
"""
if self._disconnected:
raise RuntimeError(
"Request.finish called on a request after its connection was lost; "
"use Request.notifyFinish to keep track of this.")
if self.finished:
warnings.warn("Warning! request.finish called twice.", stacklevel=2)
traceback.print_stack() #here
return
#....
...
File "C:\Python26\lib\site-packages\twisted\web\server.py", line 200, in render
self.finish()
File "C:\Python26\lib\site-packages\twisted\web\http.py", line 904, in finish
traceback.print_stack()
render
在里面
twisted.web.server
发现了这个:
if body == NOT_DONE_YET:
return
if type(body) is not types.StringType:
body = resource.ErrorPage(
http.INTERNAL_SERVER_ERROR,
"Request did not return a string",
"Request: " + html.PRE(reflect.safe_repr(self)) + "<br />" +
"Resource: " + html.PRE(reflect.safe_repr(resrc)) + "<br />" +
"Value: " + html.PRE(reflect.safe_repr(body))).render(self)
if self.method == "HEAD":
if len(body) > 0:
# This is a Bad Thing (RFC 2616, 9.4)
log.msg("Warning: HEAD request %s for resource %s is"
" returning a message body."
" I think I'll eat it."
% (self, resrc))
self.setHeader('content-length', str(len(body)))
self.write('')
else:
self.setHeader('content-length', str(len(body)))
self.write(body)
self.finish()
body
是呈现资源的结果,所以
身体
在我的问题中给出的例子中,
finish
已对此请求对象调用(自
self
从该方法传递到资源的呈现方法)。
通过查看此代码,很明显
NOT_DONE_YET
if not self.finished:
self.finish()
但是,为了不修改库,简单的回答是:
request.redirect()
你必须打电话
request.finish()
然后
return twisted.web.server.NOT_DONE_YET
我找到了一些
documentation
关于这个。它与重定向请求无关,而是使用
request.write()
request.finish()
. 从查看
render()
我明白为什么会这样。