أبدأ تطبيقي باستخدام
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'
أي نصيحة بشأن التكوينات التي يمكنني استخدامها لإصلاح هذا أم أنه خطأ؟
@ 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 ؟
التعليق الأكثر فائدة
@ kramer65 أرى. لقد كنت أنتظر هذا منذ زمن طويل ، إذا كان لدى أي شخص الإصلاح ، فيرجى مشاركته معنا! شكرا!