我目前正在用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
替换它。在这种情况下,我将不得不修改我的代码...
我做错了什么,或者File
和File
的界面是不一致的?
答案 0 :(得分:1)
你的问题本身就有一个暗示:
return NOT_DONE_YET
这是IResource
如何表示在明确“完成”请求之前是否返回调用者必须写入请求的字符串或IResource
是否负责执行这些操作的信号的一部分的东西。
检查您正在调用render
的任何内容的返回值,然后采取相应的行动。