Gunicorn: Objek 'Response' tidak memiliki atribut 'status_code' di wsgi.py dengan soket web

Dibuat pada 16 Feb 2016  ·  36Komentar  ·  Sumber: benoitc/gunicorn

Saya memulai aplikasi saya menggunakan

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

Dan ketika menggunakan Flack-SocketIO untuk soket web saya sering mendapatkan kesalahan dengan Gunicorn tidak kembali dari suatu fungsi dengan benar

[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'

Adakah saran tentang konfigurasi yang dapat saya gunakan untuk memperbaikinya atau apakah itu bug?

Feedback Requested Discussion Investigation help wanted

Komentar yang paling membantu

@kramer65 saya mengerti. saya sudah menunggu ini sejak lama, jika ada yang memperbaikinya, silakan bagikan dengan kami! Terima kasih!

Semua 36 komentar

@bclark8923 apakah Anda memiliki aplikasi yang dapat membantu mereproduksi masalah?

Ya! Apa yang bisa saya kerjakan?

Pada hari Senin, 28 Maret 2016, Benoit Chesneau [email protected] menulis:

@bclark8923 https://github.com/bclark8923 apakah Anda memiliki aplikasi?
yang dapat membantu mereproduksi masalah?


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung atau lihat di GitHub
https://github.com/benoitc/gunicorn/issues/1210#issuecomment-202484667

Terima kasih,
Brian Clark
(248) 990 5616
www.hdphealth.com

Kenali saya di Facebook https://facebook.com/bclark8923 & Twitter
https://twitter.com/blaurenceclark!

@ bclark8923 jika dapat dialirkan sehingga pada akhirnya saya dapat memasukkan beberapa bagian dalam tes yang akan membantu :)

Juga versi gunicorn mana yang Anda gunakan?

Ya silahkan! Email saya [email protected] dan 19.x dari beberapa macam dapat memeriksa
segera

Pada hari Senin, 28 Maret 2016, Benoit Chesneau [email protected] menulis:

@bclark8923 https://github.com/bclark8923 kalau bisa di streaming jadi
akhirnya saya bisa memasukkan beberapa bagian dalam tes yang akan membantu :)

Juga versi gunicorn mana yang Anda gunakan?


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung atau lihat di GitHub
https://github.com/benoitc/gunicorn/issues/1210#issuecomment -202492005

Terima kasih,
Brian Clark
(248) 990 5616
www.hdphealth.com

Kenali saya di Facebook https://facebook.com/bclark8923 & Twitter
https://twitter.com/blaurenceclark!

Menggunakan versi 19.4.5

Saya mengalami masalah yang sama. Saya menggunakan gunicorn versi 18.0.

Sudah ada perbaikan?

jika ada yang punya kode z untuk mereproduksi itu akan membantu :)

@benoitc - Masuk akal.. ;-)

Saya akan memperbaiki sesuatu minggu depan dan memberi tahu Anda!

@benoitc - Baiklah, saya memperbaiki sesuatu sebelum akhir pekan.

Anda dapat menemukan repo dengan instruksi di readme di sini: https://github.com/kramer65/gunicorn-error

btw: Saya menggunakan gunicorn versi 18.0

Mungkin ada sesuatu yang perlu dikembalikan gunicorn.workers.async.ALREADY_HANDLED atau gunicorn akan mencoba mencatat permintaan segera setelah aplikasi kembali dari pengendali WSGI-nya. Sebagai gantinya, Gunicorn perlu mengetahui bahwa permintaan tersebut sekarang ditangani sepenuhnya oleh aplikasi.

Kedua contoh di direktori "examples/websocket" mengembalikan konstanta ini dari handler WSGI mereka.

@benoitc - Apakah contoh untuk mereproduksi kesalahan membantu Anda menemukan kesalahan? Dapatkah saya menjadi bantuan lain untuk membantu ini diselesaikan?

@kramer65 ya saya mereproduksi kesalahan.

Jadi Gunicorn adalah mesin WSGI murni dan mengharapkan respons WSGI yang berisi status:
https://github.com/benoitc/gunicorn/blob/master/gunicorn/http/wsgi.py#L242

(terkait dengan kode ini: https://github.com/benoitc/gunicorn/blob/master/gunicorn/workers/async.py#L103-L119)

Seperti yang dikatakan @tilgovi , Anda dapat melewati penanganan respons dari gunicorn dengan mengembalikan ALREADY_HANDLED

Sejauh yang saya baca kode flash socketio itu membungkus aplikasi labu di socketio.Middleware yang itu sendiri berasal dari engineio.middleware.Middleware :
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/middleware.py

yang mengembalikan aplikasi wsgi atau penangannya sendiri jika menemukan jalurnya:
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/middleware.py#L45 -L52

Jadi itu mengembalikan socketio.Server.handle_request di jalur soket web:
https://github.com/miguelgrinberg/Flask-SocketIO/blob/master/flask_socketio/__init__.py#L144

yang dengan sendirinya mengembalikan engineio.Server.handle_request (banyak deps melingkar dalam proyek ini...):
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/server.py#L184

Pada titik ini tampaknya socket.handle_get_request atau socket. handle_post_request menetapkan status:
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/socket.py#L69 -L96

Dan kemudian kesalahan mungkin terjadi di sini:
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/server.py#L251 -L252

karena dapat mengembalikan respons tanpa menetapkan status atau apa pun. Saya dapat melihat bahwa pemutakhiran menggunakan objek websocket yang sama seperti pada contoh kita:
https://github.com/benoitc/gunicorn/blob/master/examples/websocket/websocket.py

Saya pikir alih-alih mengembalikan r final di sini:
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/server.py#L251 -L252

Mungkin seharusnya mengembalikan ALREADY_HANDLED seperti di sana:
https://github.com/benoitc/gunicorn/blob/master/examples/websocket/websocket.py#L115

Hanya menebak saja karena kode itu cukup sulit untuk dibaca. Semoga membantu.

@kramer65 beri tahu saya tentang status tiket ini untuk Anda :)

@benoitc konstanta ALREADY_HANDLED khusus untuk gunicorn. Eventlet memiliki versi sendiri dari konstanta ini, yang didefinisikan dengan cara yang berbeda: https://github.com/eventlet/eventlet/blob/2cd5f1d9aea53efb4526e7185017bdcc84732588/eventlet/wsgi.py#L69.

Nilai r yang Anda ikuti melalui kode mengembalikan ALREADY_HANDLED evenlet ketika koneksi websocket berakhir. Ini ditangani secara otomatis oleh eventlet: https://github.com/eventlet/eventlet/blob/2cd5f1d9aea53efb4526e7185017bdcc84732588/eventlet/websocket.py#L135.

Gunicorn harus (saya pikir) mengenali konstanta ALREADY_HANDLED eventlet selain miliknya sendiri dan menanganinya dengan cara yang sama. Saya pikir itu akan mengatasi masalah ini.

Sangat bagus jika Anda dapat memperbaiki masalah ini. Saya menjalankan flask-socketio & gunicorn pada produksi saya dan tidak ingin kehilangan data.

Saya mengalami masalah serupa, dan bertanya-tanya apakah ada berita tentang masalah ini?

@benoitc - Apakah menurut Anda saran seperti yang dibuat oleh @miguelgrinberg di atas (untuk membiarkan Gunicorn mengenali konstanta ALREADY_HANDLED eventlet selain miliknya sendiri dan menanganinya dengan cara yang sama) adalah ide yang bagus?

@kramer65 jika Anda dapat menemukan cara untuk menambahkan dukungan untuk itu, saya pikir masuk akal bagi pekerja eventlet untuk menanganinya.

Saat ini logika untuk menangani ini agak terkubur di dalam gunicorn.workers.async.AsyncWorker#handle_request tapi mungkin itu bisa ditangani dengan tipuan melalui properti statis yang dapat ditimpa oleh pekerja eventlet, atau dengan memanggil metode instance untuk memeriksa sudah ditangani oleh pekerja mana pun- logika spesifik yang mungkin ada, dengan kelas dasar melakukan seperti sekarang.

@tilgovi - Sudah lama sejak Anda mengirimi saya pesan Anda, tetapi bagaimanapun juga saya ingin menanggapi ini. Masalahnya adalah saya agak mencapai batas saya dalam apa yang bisa saya lakukan untuk ini. Saya benar-benar tidak tahu bagaimana melanjutkan untuk menyelesaikan ini.

Sementara itu, log saya dipenuhi dengan pesan kesalahan seperti di bawah ini, jadi saya punya banyak alasan untuk mengerahkan energi untuk menyelesaikannya. Saya hanya tidak sepenuhnya mengerti apa penyebab pasti masalahnya, apalagi saya mengerti bagaimana saya bisa menyelesaikan ini.

Jika ada yang ingin menghubungi saya, saya akan dengan senang hati mendiskusikan masalah ini, dan kemudian saya mungkin bisa sedikit membantu daripada sekarang.

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'

apakah ada yang memperbaikinya? .....

@qwexvf - Sayangnya saya tidak melakukannya. Log saya masih diisi dengan kesalahan. :-(

Orang lain?

@kramer65 saya mengerti. saya sudah menunggu ini sejak lama, jika ada yang memperbaikinya, silakan bagikan dengan kami! Terima kasih!

ada pembaruan?

Saya yakin ada cara yang lebih bersih untuk memperbaikinya, tetapi setidaknya ini adalah permulaan.

@stefaang terima kasih saya akan mencoba memikirkannya!

Kapan perbaikan untuk ini akan dirilis di PyPI?

besok
Pada Jumat, 17 Februari 2017 pukul 16:46, Eddie [email protected] menulis:

Kapan perbaikan untuk ini akan dirilis di PyPI?


Anda menerima ini karena Anda mengubah status buka/tutup.

Balas email ini secara langsung, lihat di GitHub
https://github.com/benoitc/gunicorn/issues/1210#issuecomment-280685264 ,
atau matikan utasnya
https://github.com/notifications/unsubscribe-auth/AAA4ogTRMF7EfR25G6gLrktOdh_iA4Ciks5rdcDYgaJpZM4HbcdP
.

Apakah sudah dirilis?

@benoitc ada kabar tentang pembaruan yang didorong ke pypi?

@defionscode saya akan membuat rilis pada kamis pagi (besok).

Luar biasa, terima kasih
Pada Rabu, 22 Februari 2017 pukul 11:54 Benoit Chesneau [email protected]
menulis:

@defionscode https://github.com/defionscode saya akan membuat rilis di
kamis pagi (besok).


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/benoitc/gunicorn/issues/1210#issuecomment-281729992 ,
atau matikan utasnya
https://github.com/notifications/unsubscribe-auth/AEcrYp6QfVpWXhG14f4M-lPDHMn0cFncks5rfGhWgaJpZM4HbcdP
.

Apakah perbaikan ini telah dirilis?

@Decker108 status dilacak oleh https://github.com/benoitc/gunicorn/issues/1471 . Akan dirilis hari ini...

Bug ini masih terjadi di pihak saya dengan versi terbaru 19 dan 20 gunicorn. Apakah itu seharusnya diperbaiki @benoitc ?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat