Gunicorn ImportError: cannot import name 'ALREADY_HANDLED' from 'eventlet.wsgi' in docker

10,423

Solution 1

Installing older version of eventlet solved the problem: pip install eventlet==0.30.2


EDIT:

you can use the newer versions like this: pip install eventlet==0.33.0 https://github.com/benoitc/gunicorn/archive/refs/heads/master.zip#egg=gunicorn==20.1.0

see: https://github.com/benoitc/gunicorn/pull/2581#issuecomment-994198667

thank you @jmunsch

Solution 2

Looks like there was a change recently to eventlet

See this PR for an example patch, and potential release version: https://github.com/benoitc/gunicorn/pull/2581

Eventlet 0.30.3+ removed wsgi.ALREADY_HANDLED breaking public API in just a patch version increase. Sorry.

Issue with ALREADY_HANDLED: eventlet/eventlet#543 Solution with WSGI_LOCAL: eventlet/eventlet#544

It's recommended to use eventlet>=0.31.0 if one uses websockets, because older versions are vulnerable to DoS attack. GHSA-9p9m-jm8w-94p2

CI failed in pylint checks on lines I didn't touch.

Share:
10,423
Mark7888
Author by

Mark7888

I'm a young programmer-student from Hungary :) I'm interestid in Python and Java programming.

Updated on June 14, 2022

Comments

  • Mark7888
    Mark7888 almost 2 years

    I had a working code running flask with gunicorn (eventlet worker) in docker. It's also working in production, but on my machine, it started doing this. I can't find anything on google about this thing. What meight be the problem?

    Error: class uri 'eventlet' invalid or not found:
    web_1       |
    web_1       | [Traceback (most recent call last):
    web_1       |   File "/root/.local/lib/python3.7/site-packages/gunicorn/util.py", line 99, in load_class
    web_1       |     mod = importlib.import_module('.'.join(components))
    web_1       |   File "/usr/local/lib/python3.7/importlib/__init__.py", line 127, in import_module
    web_1       |     return _bootstrap._gcd_import(name[level:], package, level)
    web_1       |   File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
    web_1       |   File "<frozen importlib._bootstrap>", line 983, in _find_and_load
    web_1       |   File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
    web_1       |   File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
    web_1       |   File "<frozen importlib._bootstrap_external>", line 728, in exec_module
    web_1       |   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
    web_1       |   File "/root/.local/lib/python3.7/site-packages/gunicorn/workers/geventlet.py", line 20, in <module>
    web_1       |     from eventlet.wsgi import ALREADY_HANDLED as EVENTLET_ALREADY_HANDLED
    web_1       | ImportError: cannot import name 'ALREADY_HANDLED' from 'eventlet.wsgi' (/root/.local/lib/python3.7/site-packages/eventlet/wsgi.py)
    web_1       | ]
    
  • jmunsch
    jmunsch almost 3 years
    Just to note: there is a websocket DOS vulnerability in this version. GHSA-9p9m-jm8w-94p2 the reason for the breaking change
  • sqp_125
    sqp_125 over 2 years
    Hm I have docker alpine3.8 and eventlet==0.33.0, still get the Error ImportError: cannot import name 'ALREADY_HANDLED' from 'eventlet.wsgi'
  • jmunsch
    jmunsch over 2 years