我正在创建一个非常简单的Python脚本,以便将一个文件提供给一个人。但是,在请求完成或损坏时,我似乎无法弄清楚如何触发回调。我正在调查using deferreds,但我很难绕过他们的工作方式。
据我所知,我的服务器同步运行所有内容,所以我希望这足够了:
class FileResource(resource.Resource):
isLeaf = True
def __init__(self, filepath):
self.filepath = filepath
self.filename = os.path.basename(filepath)
def render_GET(self, request):
print '%s: request opened (%s)' % (get_time(), request.getClientIP())
request.setHeader('content-type', 'application/octet-stream')
request.setHeader('content-disposition', 'attachment; filename="%s"' % self.filename)
request.setHeader('content-length', os.path.getsize(self.filepath))
with open(self.filepath, 'rb') as f:
request.write(f.read())
request.finish()
print '%s: request closed (%s)' % (get_time(), request.getClientIP())
return server.NOT_DONE_YET
但是第二个印刷品立即发射。如果有人能指出正确的方向,我将不胜感激。
答案 0 :(得分:0)
您可以使用Request.notifyFinish
了解何时处理完请求。不幸的是,这并没有告诉您何时实际通过网络发送了响应。如果您在Request.notifyFinish
告诉您时关闭服务器,那么您最有可能最终截断响应。
另一种更可靠但不太方便的方法是使用Connection: close
并注意HTTP实现何时关闭底层连接。您可以通过挂钩协议的connectionLost
方法(对于Twisted Web服务器HTTPChannel
)来执行此操作。