5

サービスに参加するためのコードを書いています。特定のサービスへの POST リクエストを受け取り、処理を開始します。全体のプロセスはかなり単純です。リクエスト内の項目をループして、各項目をデータベースに追加します。問題は、多くのアイテムを処理する必要があり、ループが終了するまでに 3 分ほどかかる場合に発生します。その後、応答しようとすると、次のようになります。

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 AcceptedResponse!で応答する必要がある場合があります。http 応答コードの完全な概要については、次のリンクをたどってください: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

202 承認済み

リクエストは処理のために受け入れられましたが、処理は完了していません。処理が実際に行われるときに許可されない可能性があるため、要求は最終的に処理される場合と処理されない場合があります。このような非同期操作からステータス コードを再送信する機能はありません。

202 応答は、意図的に非コミットです。その目的は、プロセスが完了するまでサーバーへのユーザー エージェントの接続を維持する必要なく、サーバーが他のプロセス (おそらく 1 日に 1 回だけ実行されるバッチ指向のプロセス) の要求を受け入れることを可能にすることです。この応答で返されるエンティティには、要求の現在のステータスの表示と、ステータス モニターへのポインター、またはユーザーが要求がいつ満たされると期待できるかの推定値のいずれかを含める必要があります。

于 2013-01-04T22:51:17.913 に答える
2

私は間違っている可能性がありますが、ソケットがタイムアウトしているように見えます。クライアントを3分以上応答のためにハングさせたままにしないでください。

代わりに、データを検証し、データが受信されたことを示すメッセージを送信する必要があります。必要に応じて、AJAXなどを使用して、データの受信後にデータが入力されたことをクライアントに通知できます。

于 2013-01-04T21:12:45.630 に答える