Gunicorn: 「Response」オブジェクトには、WebSocketを使用するwsgi.pyに「status_code」属性がありません

作成日 2016年02月16日  ·  36コメント  ·  ソース: benoitc/gunicorn

を使用してアプリを起動します

gunicorn --worker-class eventlet -w 1 server:app --bind="127.0.0.1:5000"

また、WebSocketにFlack-SocketIOを使用すると、Gunicornが関数から正しく戻らないというエラーが発生することがよくあります。

[2016-01-30 10:20:53 -0800] [7330] [ERROR] Error handling request
Traceback (most recent call last):
  File "/Users/brianclark/Desktop/Projects/HDP/application/api/venv/lib/python2.7/site-packages/gunicorn/workers/async.py", line 52, in handle
    self.handle_request(listener_name, req, client, addr)
  File "/Users/brianclark/Desktop/Projects/HDP/application/api/venv/lib/python2.7/site-packages/gunicorn/workers/async.py", line 114, in handle_request
    resp.close()
  File "/Users/brianclark/Desktop/Projects/HDP/application/api/venv/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 423, in close
    self.send_headers()
  File "/Users/brianclark/Desktop/Projects/HDP/application/api/venv/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 316, in send_headers
    tosend = self.default_headers()
  File "/Users/brianclark/Desktop/Projects/HDP/application/api/venv/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 297, in default_headers
    elif self.should_close():
  File "/Users/brianclark/Desktop/Projects/HDP/application/api/venv/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 230, in should_close
    if self.status_code < 200 or self.status_code in (204, 304):
AttributeError: 'Response' object has no attribute 'status_code'

これを修正するために使用できる構成に関するアドバイスはありますか、それともバグですか?

Feedback Requested Discussion Investigation help wanted

最も参考になるコメント

@ kramer65なるほど。 私はこれを何年も待っていました、誰かが修正を持っているなら私たちと共有してください! ありがとう!

全てのコメント36件

@ bclark8923問題の再現に役立つアプリケーションはありますか?

うん! 私に何をしてもらいたいですか?

2016年3月28日(月曜日)には、ブノワChesneauの[email protected]書きました:

@ bclark8923https ://github.com/bclark8923アプリケーションはありますか
それは問題を再現するのに役立つ可能性がありますか?


あなたが言及されたのであなたはこれを受け取っています。
このメールに直接返信するか、GitHubで表示してください
https://github.com/benoitc/gunicorn/issues/1210#issuecomment -202484667

ありがとう、
ブライアンクラーク
(248)990 5616
www.hdphealth.com

Facebook https://facebook.com/bclark8923&Twitterで私を知って
https://twitter.com/blaurenceclark!

@ bclark8923ストリーミングできる場合は、最終的にはテストに役立つ部分を含めることができます:)

また、どのバージョンのgunicornを使用していますか?

はい、お願いします! 私に電子メールを送ってください19.xはチェックすることができます
すぐ

2016年3月28日(月曜日)には、ブノワChesneauの[email protected]書きました:

@ bclark8923 https://github.com/bclark8923ストリーミングできる場合は、
最終的に私は役立つテストにいくつかの部分を含めることができます:)

また、どのバージョンのgunicornを使用していますか?


あなたが言及されたのであなたはこれを受け取っています。
このメールに直接返信するか、GitHubで表示してください
https://github.com/benoitc/gunicorn/issues/1210#issuecomment -202492005

ありがとう、
ブライアンクラーク
(248)990 5616
www.hdphealth.com

Facebook https://facebook.com/bclark8923&Twitterで私を知って
https://twitter.com/blaurenceclark!

バージョン19.4.5を使用

私は同じ問題を抱えています。 gunicornバージョン18.0を使用しています。

すでに利用可能な修正はありますか?

誰かがそれを再現するためのzコードを持っているなら、それは助けになるでしょう:)

@ benoitc-それは理にかなっています.. ;-)

来週何かを修正してお知らせします!

@ benoitc-了解しました。結局、週末の前に何かを修正しました。

こちらのreadmeに手順が記載されたリポジトリを見つけることができます: https

ところで:私はgunicornバージョン18.0を使用しています

おそらく何かがgunicorn.workers.async.ALREADY_HANDLEDを返す必要があります。そうしないと、アプリケーションがWSGIハンドラーから戻るとすぐにgunicornがリクエストをログに記録しようとします。 代わりに、Gunicornは、リクエストが完全にアプリケーションによって処理されるようになったことを知る必要があります。

「examples / websocket」ディレクトリの両方の例は、WSGIハンドラーからこの定数を返します。

@ benoitc-エラーを再現する例は、エラーを見つけるのに役立ちますか? これを解決するために他に何かお手伝いできますか?

@ kramer65はいエラーを再現しました。

したがって、Gunicornは純粋なWSGIエンジンであり、ステータスを含むWSGI応答を期待しています。
https://github.com/benoitc/gunicorn/blob/master/gunicorn/http/wsgi.py#L242

(このコードに関連:https://github.com/benoitc/gunicorn/blob/master/gunicorn/workers/async.py#L103-L119)

@tilgoviが言ったように、ALREADY_HANDLEDを返すことで、gunicornからの応答処理をバイパスできます。

flash socketioのコードを読んでいる限り、フラスコアプリケーションをsocketio.Middlewareでラップしており、それ自体がengineio.middleware.Middlewareから継承しています。
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/middleware.py

パスが見つかった場合は、wsgiアプリケーションまたは独自のハンドラーを返します。
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/middleware.py#L45 -L52

したがって、WebSocketパスでsocketio.Server.handle_requestを返します。
https://github.com/miguelgrinberg/Flask-SocketIO/blob/master/flask_socketio/__init__.py#L144

それ自体がengineio.Server.handle_request返します(このプロジェクトには多くの循環深度があります...):
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/server.py#L184

この時点で、 socket.handle_get_requestsocket. handle_post_requestもステータスを設定していないようです。
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/socket.py#L69 -L96

そして、ここでエラーが発生する可能性があります。
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/server.py#L251 -L252

ステータスなどを設定せずに応答を返すことができるためです。 アップグレードでは、次の例と同じWebSocketオブジェクトが使用されていることがわかります。
https://github.com/benoitc/gunicorn/blob/master/examples/websocket/websocket.py

ここで最後のrを返す代わりに、次のように思います。
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/server.py#L251 -L252

おそらく次のようにALREADY_HANDLED返すはずです。
https://github.com/benoitc/gunicorn/blob/master/examples/websocket/websocket.py#L115

そのコードは読むのが非常に難しいので、とにかく推測してください。 うまくいけば、それが役立つでしょう。

@ kramer65とにかくこのチケットのステータスについて教えてください:)

@benoitc ALREADY_HANDLED定数はgunicornに固有です。 Eventletには、この定数の独自のバージョンがあり、別の方法で定義されています: https

コードを介してフォローしていたr値は、WebSocket接続が終了するとevenletのALREADY_HANDLED返します。 これはイベントレットによって自動的に処理されます: https

Gunicornは(私が思うに)eventletのALREADY_HANDLED定数をそれ自体に加えて認識し、同じように処理する必要があります。 私はそれがこの問題に対処すると思います。

この問題を修正できれば素晴らしいです。 プロダクションでflask-socketioとgunicornを実行していますが、データを失いたくありません。

私は同様の問題を経験していますが、この問題に関するニュースがあるかどうか疑問に思っていましたか?

@ benoitc-上記の

@ kramer65それをきれいにサポートする方法を見つけることが

現在、これを処理するロジックはgunicorn.workers.async.AsyncWorker#handle_request内に少し埋め込まれていますが、イベントレットワーカーがオーバーライドできる静的プロパティを介した間接参照、またはインスタンスメソッドを呼び出してワーカーによって既に処理されていることを確認することで処理できる可能性があります-存在する可能性のある特定のロジック。基本クラスは現在と同じように機能します。

@ tilgovi-あなたが私にあなたのメッセージを送ってからしばらく経ちました、しかし私は結局これに答えたかったです。 問題は、私がこれのために何ができるかということで、私がちょっと限界に達したということです。 私はこれを解決するためにどのように進めるかについて本当に手がかりがありません。

その間、私のログは以下のようなエラーメッセージでいっぱいになるので、これを解決するためにいくらかのエネルギーを注ぐ理由は十分にあります。 問題の正確な原因が何であるかを完全には理解していません。ましてや、これをどのように解決できるかを理解していることは言うまでもありません。

誰かが連絡を取りたいと思ったら、私はこの問題について喜んで話し合います。そうすれば、私は今よりも少し助けになるかもしれません。

2016-08-23 08:07:16 [2185] [ERROR] Error handling request
Traceback (most recent call last):
  File "/var/www/imd/venv/local/lib/python2.7/site-packages/gunicorn/workers/async.py", line 45, in handle
    self.handle_request(listener, req, client, addr)
  File "/var/www/imd/venv/local/lib/python2.7/site-packages/gunicorn/workers/async.py", line 102, in handle_request
    resp.close()
  File "/var/www/imd/venv/local/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 369, in close
    self.send_headers()
  File "/var/www/imd/venv/local/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 284, in send_headers
    tosend = self.default_headers()
  File "/var/www/imd/venv/local/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 265, in default_headers
    elif self.should_close():
  File "/var/www/imd/venv/local/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 198, in should_close
    if self.status_code < 200 or self.status_code in (204, 304):
AttributeError: 'Response' object has no attribute 'status_code'

修正しましたか?....。

@ qwexvf-残念ながら私はしませんでした。 私のログはまだエラーでいっぱいです。 :-(

他の人は?

@ kramer65なるほど。 私はこれを何年も待っていました、誰かが修正を持っているなら私たちと共有してください! ありがとう!

更新はありますか?

これを修正するためのよりクリーンな方法があると確信していますが、少なくともそれは始まりです。

@stefaangありがとう、考えてみよう!

これに対する修正はいつPyPIでリリースされますか?

明日
16:46で金、2017年2月17日には、エディの[email protected]書きました:

これに対する修正はいつPyPIでリリースされますか?


開/閉状態を変更したため、これを受け取っています。

このメールに直接返信し、GitHubで表示してください
https://github.com/benoitc/gunicorn/issues/1210#issuecomment-280685264
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/AAA4ogTRMF7EfR25G6gLrktOdh_iA4Ciks5rdcDYgaJpZM4HbcdP

リリースされましたか?

@benoitc pypiにプッシュされているアップデートに関する単語はありますか?

@defionscode木曜日の朝(明日)にリリースします。

優れたありがとう
11時54分AMブノワChesneauの水、2017年2月22日には[email protected]
書きました:

@defionscodehttps ://github.com/defionscodeでリリースします
木曜日の朝(明日)。


あなたが言及されたのであなたはこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/benoitc/gunicorn/issues/1210#issuecomment-281729992
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/AEcrYp6QfVpWXhG14f4M-lPDHMn0cFncks5rfGhWgaJpZM4HbcdP

この修正はリリースされましたか?

@ Decker108のステータスは、 https://github.com/benoitc/gunicorn/issues/1471によって追跡され

このバグは、gunicornの最新バージョン19および20でまだ発生しています。 @benoitcで修正されるはず

このページは役に立ちましたか?
0 / 5 - 0 評価