簡體   English   中英

在Python中使用耗時的REST服務時出錯

[英]Error with time-consuming REST service in Python

我正在編寫代碼來參加服務。 我收到對特定服務的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模式)。

如何避免此錯誤?

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

如果處理可能需要一些時間,服務可能想要通過202 Accepted響應來回答它! 有關http響應代碼的完整概述, 請訪問以下鏈接: http//www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

202接受

該請求已被接受處理,但處理尚未完成。 該請求最終可能會或可能不會被執行,因為在實際處理時可能不允許該請求。 沒有用於從諸如此類的異步操作重新發送狀態代碼的工具。

202回復是故意不承諾的。 其目的是允許服務器接受對某些其他進程的請求(可能是每天只運行一次的面向批處理的進程),而不要求用戶代理與服務器的連接持續到進程完成為止。 返回此響應的實體應該包括請求的當前狀態的指示,以及指向狀態監視器的指針或用戶可以期望滿足請求的某些估計。

我可能是錯的,但它只是看起來像套接字超時。 您不應該讓客戶端掛起響應超過三分鍾。

相反,您應該驗證數據並發送一條消息,說明它已收到。 如有必要,您可以使用類似AJAX的東西告訴客戶端數據是在收到后輸入的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM