gpt4 book ai didi

python - Twisted web - 响应客户端后保留请求数据

转载 作者:太空宇宙 更新时间:2023-11-03 19:15:10 24 4
gpt4 key购买 nike

我有一个用 Twisted Web 编写的前端 Web 服务器,它与另一个 Web 服务器交互。客户端将文件上传到我的前端服务器,然后前端服务器将文件发送到后端服务器。我想接收上传的文件,然后立即向客户端发送响应,然后再将文件发送到后端服务器。这样客户端就不必等待两次上传都发生才能获得响应。

我尝试通过在单独的线程中开始上传到后端服务器来实现此目的。问题是,在向客户端发送响应后,我无法再从 Request 对象访问上传的文件。这是一个例子:

class PubDir(Resource):

def render_POST(self, request):
if request.args["t"][0] == 'upload':
thread.start_new_thread(self.upload, (request,))

### Send response to client while the file gets uploaded to the back-end server:
return redirectTo('http://example.com/uploadpage')

def upload(self, request):
postheaders = request.getAllHeaders()
try:
postfile = cgi.FieldStorage(
fp = request.content,
headers = postheaders,
environ = {'REQUEST_METHOD':'POST',
'CONTENT_TYPE': postheaders['content-type'],
}
)
except Exception as e:
print 'something went wrong: ' + str(e)

filename = postfile["file"].filename

file = request.args["file"][0]

#code to upload file to back-end server goes here...

当我尝试此操作时,出现错误:对已关闭文件进行 I/O 操作

最佳答案

在完成请求对象之前,您需要实际将文件复制到内存中的缓冲区或磁盘上的临时文件中(这就是重定向时发生的情况)。

因此,您正在启动线程并向其传递请求对象,它可能会打开与后端服务器的连接,并在您重定向时开始复制,从而完成请求并关闭所有关联的临时文件,您就会遇到麻烦。

快速测试不是将整个请求传递到您的线程,而是尝试仅将请求的内容传递到您的线程:

thread.start_new_thread(self.upload, (request.content.read(),))

关于python - Twisted web - 响应客户端后保留请求数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11553751/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com