Gunicorn ImportError: cannot import name 'ALREADY_HANDLED' from 'eventlet.wsgi' in docker
Gunicorn ImportError: cannot import name 'ALREADY_HANDLED' from 'eventlet.wsgi' in docker
我在 docker 中有一个工作代码 运行 flask with gunicorn (eventlet worker)。它也在生产中工作,但在我的机器上,它开始这样做了。我在 google 上找不到任何关于这件事的信息。可能是什么问题?
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 | ]
安装旧版本的 eventlet 解决了问题:pip install eventlet==0.30.2
编辑:
您可以像这样使用较新的版本:
pip install eventlet==0.33.0 https://github.com/benoitc/gunicorn/archive/refs/heads/master.zip#egg=gunicorn==20.1.0
参见:https://github.com/benoitc/gunicorn/pull/2581#issuecomment-994198667
谢谢@jmunsch
最近似乎对 eventlet
进行了更改
查看此 PR 以获取示例补丁和可能的发布版本: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.
我在尝试将 SocketIO 与 Flask 一起使用时遇到了完全相同的错误,并在 https://localcoder.org/deploy-flask-socketio-on-beanstalk
找到了答案
我按照他们的建议得到了这个运行:
pip uninstall gunicorn
pip uninstall eventlet
pip install gunicorn==20.1.0
pip install eventlet==0.30.2
gunicorn --worker-class eventlet -w 1 app:app
环境:AWS ALB -> EC2/Linux2(python 3.8.5,Flask Socket.IO)
我在 docker 中有一个工作代码 运行 flask with gunicorn (eventlet worker)。它也在生产中工作,但在我的机器上,它开始这样做了。我在 google 上找不到任何关于这件事的信息。可能是什么问题?
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 | ]
安装旧版本的 eventlet 解决了问题:pip install eventlet==0.30.2
编辑:
您可以像这样使用较新的版本:
pip install eventlet==0.33.0 https://github.com/benoitc/gunicorn/archive/refs/heads/master.zip#egg=gunicorn==20.1.0
参见:https://github.com/benoitc/gunicorn/pull/2581#issuecomment-994198667
谢谢@jmunsch
最近似乎对 eventlet
查看此 PR 以获取示例补丁和可能的发布版本: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.
我在尝试将 SocketIO 与 Flask 一起使用时遇到了完全相同的错误,并在 https://localcoder.org/deploy-flask-socketio-on-beanstalk
找到了答案我按照他们的建议得到了这个运行:
pip uninstall gunicorn
pip uninstall eventlet
pip install gunicorn==20.1.0
pip install eventlet==0.30.2
gunicorn --worker-class eventlet -w 1 app:app
环境:AWS ALB -> EC2/Linux2(python 3.8.5,Flask Socket.IO)