Gunicorn: كائن 'Response' ليس له خاصية 'status_code' في wsgi.py مع websockets

تم إنشاؤها على ١٦ فبراير ٢٠١٦  ·  36تعليقات  ·  مصدر: benoitc/gunicorn

أبدأ تطبيقي باستخدام

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

وعند استخدام 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 هل لديك أي تطبيق يمكن أن يساعد في إعادة

نعم! ماذا تريد مني ان افعل؟

في يوم الاثنين ، 28 مارس 2016 ، كتب Benoit Chesneau [email protected] :

@ bclark8923 https://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 تستخدمه أيضًا؟

نعم من فضلك! أرسل لي بريدًا إلكترونيًا إلى
هكذا

في يوم الاثنين ، 28 مارس 2016 ، كتب Benoit 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

لدي نفس المشكلة. أنا أستخدم الإصدار 18.0 من gunicorn.

أي إصلاح متاح بالفعل؟

إذا كان لدى أي شخص رمز z لإعادة إنتاجه ، فسيكون ذلك مفيدًا :)

benoitc - هذا منطقي .. ؛-)

سأصلح شيئًا ما الأسبوع المقبل وأعلمك!

benoitc - حسنًا ، لقد أصلحت شيئًا قبل نهاية الأسبوع بعد كل شيء.

يمكنك العثور على الريبو مع الإرشادات الموجودة في الملف التمهيدي هنا: https://github.com/kramer65/gunicorn-error

راجع للشغل: أنا أستخدم الإصدار 18.0 من gunicorn

ربما يحتاج شيء ما إلى إرجاع gunicorn.workers.async.ALREADY_HANDLED أو سيحاول Gunicorn تسجيل الطلب بمجرد عودة التطبيق من معالج WSGI الخاص به. يحتاج Gunicorn إلى معرفة ، بدلاً من ذلك ، أن الطلب يتم التعامل معه الآن بالكامل بواسطة التطبيق.

كلا المثالين في دليل "أمثلة / 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 ، يمكنك تجاوز معالجة الاستجابة من gunicorn عن طريق إرجاع ALREADY_HANDLED

بقدر ما قرأت كود flash socketio ، فإنه يتم تغليف تطبيق flask بـ 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

لذلك تقوم بإرجاع socketio.Server.handle_request على مسار websocket:
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_request أو socket. 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://github.com/eventlet/eventlet/blob/2cd5f1d9aea53efb4526e7185017bdcc84732588/eventlet/wsgi.py#L69.

تُرجع القيمة r التي كنت تتابعها من خلال الرمز ALREADY_HANDLED عندما ينتهي اتصال websocket. تتم معالجة هذا تلقائيًا بواسطة eventlet: https://github.com/eventlet/eventlet/blob/2cd5f1d9aea53efb4526e7185017bdcc84732588/eventlet/websocket.py#L135.

يجب على Gunicorn (على ما أعتقد) التعرف على ثابت Eventlet ALREADY_HANDLED بالإضافة إلى قيمته الخاصة والتعامل معه بنفس الطريقة. أعتقد أن هذا سوف يعالج هذه المشكلة.

إنه لأمر رائع أن تتمكن من حل هذه المشكلة. أنا أدير flask-socketio & gunicorn على إنتاجي ولا أريد أن أفقد البيانات.

أواجه مشكلات مماثلة ، وكنت أتساءل عما إذا كان هناك أي أخبار عن هذا الموضوع؟

benoitc - هل تعتقد أن الاقتراح الذي قدمه miguelgrinberg أعلاه (للسماح لـ Gunicorn بالتعرف على ثابت ALREADY_HANDLED الخاص بـ Eventlet بالإضافة إلى ثباته والتعامل معه بنفس الطريقة) فكرة جيدة؟

@ 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؟

غدا
في الجمعة ، 17 فبراير 2017 الساعة 16:46 ، كتب Eddie [email protected] :

متى سيتم إصدار الإصلاح الخاص بهذا على PyPI؟

-
أنت تتلقى هذا لأنك قمت بتعديل حالة الفتح / الإغلاق.

قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/benoitc/gunicorn/issues/1210#issuecomment-280685264 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/AAA4ogTRMF7EfR25G6gLrktOdh_iA4Ciks5rdcDYgaJpZM4HbcdP
.

هل تم الافراج عنه؟

benoitc هل تم دفع أي كلمة بخصوص التحديث إلى pypi؟

defionscode سأصدر بيانًا صباح يوم الخميس (غدًا).

ممتاز شكرا لك
يوم الأربعاء 22 فبراير 2017 الساعة 11:54 صباحًا Benoit Chesneau [email protected]
كتب:

defionscode https://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 . سيصدر اليوم ...

لا يزال هذا الخطأ يحدث من جانبي مع أحدث إصدار 19 و 20 من gunicorn. هل كان من المفترض أن يتم إصلاحه benoitc ؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات