【问题标题】:Twisted, deferred requests and File vs ErrorPage扭曲的、延迟的请求和 File vs ErrorPage
【发布时间】:2014-02-18 10:10:22
【问题描述】:

我目前正在使用 python/twisted 构建一个 http 服务器。

此服务器必须在另一个 Web 服务器上获取内容,将其存储在本地并将响应发送回客户端。如果遇到 404,它必须尝试提供本地文件,否则如果根本没有本地文件就会失败。

为了实现这一点,我使用了不同的请求。我的代码大致是这样的:

class RemoteFile(Resource):
    isLeaf = True

    def render_GET(self, request):
        # Start downloading the corresponding file on the remote server
        # Will call `self.serve_local_file` when done
        return NOT_DONE_YET

    def serve_local_file(self, request):
        if self.file_exists_for_request(request):
            fileResource = File(filename)
            fileResource.render(request)
        else:
            page = NoResource("No such file")
            html = page.render(request)

            # The next two lines are my problem
            request.write(html)
            request.finish()

我必须添加最后两行(write()finish())才能让请求真正完成。对于File 资源,我不需要这些行,因为它自己处理写入/完成,这与 NoResource 不同。

这本身不是问题,但事实证明这个page 变量不是硬编码的,它实际上是我的类上的fallback 属性,应该是Resource。这意味着我将来可以用默认的File 替换它。在这种情况下,我将不得不修改我的代码......

是我做错了什么,还是FileErrorPage的接口不一致?

【问题讨论】:

  • 请包含一个完整的、可运行的示例,这样我们就可以实际运行某些东西并查看行为是什么,而不是猜测。

标签: python twisted deferred


【解决方案1】:

你的问题本身就有提示:

return NOT_DONE_YET

这是IResource 表示它是否返回一个字符串的一部分,调用者必须在显式“完成”请求之前将其写入请求,或者IResource 是否负责执行这些操作。

检查您调用render 的任何内容的返回值,然后采取相应措施。

【讨论】:

  • 有趣的答案,我会调查一下!
猜你喜欢
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
相关资源
最近更新 更多