在Python中使用耗时的REST服务时出错

时间:2013-01-04 20:57:43

标签: python rest

我正在编写代码来参加服务。我收到对特定服务的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请求是从浏览器转发到不同域的转发(这就是Access-Control-Allow-Origin的原因)以及对数据库的所有访问使用SQLAlchemy与数据库交互的单个对象(可以看作类似于Java EE DAO模式)。

如何避免此错误?

2 个答案:

答案 0 :(得分:5)

你可能违反了REST背后的想法。

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

  

202接受

     

请求已被接受处理,但处理尚未完成。该请求最终可能会或可能不会被执行,因为在实际处理时可能不允许该请求。没有从异步操作中重新发送状态代码的工具。

     

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

答案 1 :(得分:2)

我可能错了,但它只是看起来像套接字超时。你不应该让客户挂起响应超过三分钟。

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