5

我正在编写代码来参加服务。我收到对特定服务的 POST 请求并开始处理。整个过程相当简单;我循环请求中的项目并将每个项目添加到数据库中。当我必须处理很多项目并且循环需要大约三分钟才能完成时,就会出现问题,然后当我尝试响应时:

status = '200 OK'
headers = [('Content-type', 'application/json'),('Access-Control-Allow-Origin','*')]
start_response(status, headers)

return json.dumps(response)

我收到此错误:

Exception happened during processing of request from ('XXX.XXX.XXX.XXX', 49172)
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/SocketServer.py", line 284, in _handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/local/lib/python2.7/SocketServer.py", line 310, in process_request
    self.finish_request(request, client_address)
  File "/usr/local/lib/python2.7/SocketServer.py", line 323, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/local/lib/python2.7/SocketServer.py", line 640, in __init__
    self.finish()
  File "/usr/local/lib/python2.7/SocketServer.py", line 693, in finish
    self.wfile.flush()
  File "/usr/local/lib/python2.7/socket.py", line 303, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe

我不知道这是否有帮助,但 POST 请求是从浏览器到不同域的转发 POST(这就是为什么使用 Access-Control-Allow-Origin)并且对数据库的所有访问都是使用单个使用SQLAlchemy与数据库交互的对象(类似于Java EE DAO模式)。

如何避免此错误?

4

2 回答 2

5

您可能违反了 REST 背后的理念。

如果处理可能需要一些时间,则服务可能希望使用202 Accepted响应来回答它!有关 http 响应代码的完整概述,请点击以下链接:http ://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

202 接受

请求已被接受处理,但处理尚未完成。该请求最终可能会或可能不会被执行,因为在实际进行处理时它可能会被禁止。无法从诸如此类的异步操作中重新发送状态代码。

202 响应是故意不置可否的。它的目的是允许服务器接受对某个其他进程的请求(可能是一个每天只运行一次的面向批处理的进程),而不需要用户代理与服务器的连接持续到该进程完成。与此响应一起返回的实体应该包括请求当前状态的指示以及指向状态监视器的指针或用户可以期望何时完成请求的一些估计。

于 2013-01-04T22:51:17.913 回答
2

我可能是错的,但在我看来,套接字正在超时。您不应让客户端等待响应的时间超过三分钟。

相反,您应该验证数据并发送一条消息,说明它已收到。如有必要,您可以使用 AJAX 之类的东西来告诉客户端数据是在收到后输入的。

于 2013-01-04T21:12:45.630 回答