Twisted,延迟请求和File vs ErrorPage

时间:2014-02-18 10:10:22

标签: python twisted deferred

我目前正在用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属性,应该是{{1} }}。这意味着我将来可能希望用默认的Resource替换它。在这种情况下,我将不得不修改我的代码...

我做错了什么,或者FileFile的界面是不一致的?

1 个答案:

答案 0 :(得分:1)

你的问题本身就有一个暗示:

return NOT_DONE_YET

这是IResource如何表示在明确“完成”请求之前是否返回调用者必须写入请求的字符串或IResource是否负责执行这些操作的信号的一部分的东西。

检查您正在调用render的任何内容的返回值,然后采取相应的行动。