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

Ser*_*rán 5 python rest

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

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

return json.dumps(response)
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

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
Run Code Online (Sandbox Code Playgroud)

我不知道这是否有帮助,但POST请求是从浏览器转发到另一个域的转发(这就是Access-Control-Allow-Origin的原因)以及对数据库的所有访问都是使用单个进行的使用SQLAlchemy与数据库交互的对象(可以看作类似于Java EE DAO模式).

如何避免此错误?

ssc*_*ass 5

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

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

202接受

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

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