扭曲:如何正确检查请求是否已完成

时间:2014-05-07 16:47:35

标签: python twisted

我正在创建一个非常简单的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

但是第二个印刷品立即发射。如果有人能指出正确的方向,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以使用Request.notifyFinish了解何时处理完请求。不幸的是,这并没有告诉您何时实际通过网络发送了响应。如果您在Request.notifyFinish告诉您时关闭服务器,那么您最有可能最终截断响应。

另一种更可靠但不太方便的方法是使用Connection: close并注意HTTP实现何时关闭底层连接。您可以通过挂钩协议的connectionLost方法(对于Twisted Web服务器HTTPChannel)来执行此操作。