Flask套接字IO出现Heroku应用程序错误



该应用程序在本地运行良好,但在heroku服务器上返回应用程序错误。我怀疑问题可能出在Procfile上,当我把它改为";web:gunicorn eventlet-w 1 app:app";,从";web:gunicorn app:app"它停止工作了,我是socketIO和flask的新手,我试过在互联网上看到的所有东西都放在与socketIO一起工作的Procfile上,但都不起作用。如果有人知道为什么会发生这种事,请帮帮我。

这是我的需求.txt文件:

bidict==0.22.0
brotlipy==0.7.0
certifi==2021.10.8
click==8.1.3
dnspython==2.2.1
eventlet==0.33.1
Flask==2.1.3
Flask-SocketIO==5.2.0
Flask-SQLAlchemy==2.5.1
Flask-WTF==1.0.1
gevent==21.12.0
gevent-websocket==0.10.1
greenlet==1.1.2
gunicorn==20.1.0
importlib-metadata==4.12.0
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.1
psycopg2==2.9.3
pycosat==0.6.3
python-engineio==4.3.3
python-socketio==5.7.1
SQLAlchemy==1.4.39
Werkzeug==2.1.2
wincertstore==0.2
WTForms==3.0.1
zipp==3.8.1
zope.event==4.5.0
zope.interface==5.4.0

这是heroku日志:

2022-08-05T15:16:18.022704+00:00 app[web.1]:
2022-08-05T15:16:18.022716+00:00 app[web.1]: Error: class uri 'eventlet' invalid or not found:
2022-08-05T15:16:18.022716+00:00 app[web.1]:
2022-08-05T15:16:18.022717+00:00 app[web.1]: [Traceback (most recent call last):
2022-08-05T15:16:18.022717+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.10/site-packages/gunicorn/util.py", line 99, in load_class
2022-08-05T15:16:18.022718+00:00 app[web.1]: mod = importlib.import_module('.'.join(components))
2022-08-05T15:16:18.022718+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.10/importlib/__init__.py", line 126, in import_module
2022-08-05T15:16:18.022718+00:00 app[web.1]: return _bootstrap._gcd_import(name[level:], package, level)
2022-08-05T15:16:18.022719+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
2022-08-05T15:16:18.022719+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
2022-08-05T15:16:18.022720+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
2022-08-05T15:16:18.022720+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
2022-08-05T15:16:18.022720+00:00 app[web.1]: File "<frozen importlib._bootstrap_external>", line 883, in exec_module
2022-08-05T15:16:18.022721+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
2022-08-05T15:16:18.022721+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.10/site-packages/gunicorn/workers/geventlet.py", line 20, in <module>
2022-08-05T15:16:18.022721+00:00 app[web.1]: from eventlet.wsgi import ALREADY_HANDLED as EVENTLET_ALREADY_HANDLED
2022-08-05T15:16:18.022722+00:00 app[web.1]: ImportError: cannot import name 'ALREADY_HANDLED' from 'eventlet.wsgi' (/app/.heroku/python/lib/python3.10/site-packages/eventlet/wsgi.py)
2022-08-05T15:16:18.022722+00:00 app[web.1]: ]
2022-08-05T15:16:18.022722+00:00 app[web.1]:
2022-08-05T15:16:18.246442+00:00 heroku[web.1]: Process exited with status 1
2022-08-05T15:16:18.357952+00:00 heroku[web.1]: State changed from starting to crashed
2022-08-05T15:16:18.374380+00:00 heroku[web.1]: State changed from crashed to starting
2022-08-05T15:16:23.365045+00:00 heroku[web.1]: Starting process with command `gunicorn -k eventlet -w 1 app:app`
2022-08-05T15:16:24.399378+00:00 app[web.1]:
2022-08-05T15:16:24.399392+00:00 app[web.1]: Error: class uri 'eventlet' invalid or not found:
2022-08-05T15:16:24.399392+00:00 app[web.1]:
2022-08-05T15:16:24.399393+00:00 app[web.1]: [Traceback (most recent call last):
2022-08-05T15:16:24.399393+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.10/site-packages/gunicorn/util.py", line 99, in load_class
2022-08-05T15:16:24.399393+00:00 app[web.1]: mod = importlib.import_module('.'.join(components))
2022-08-05T15:16:24.399394+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.10/importlib/__init__.py", line 126, in import_module
2022-08-05T15:16:24.399394+00:00 app[web.1]: return _bootstrap._gcd_import(name[level:], package, level)
2022-08-05T15:16:24.399394+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
2022-08-05T15:16:24.399395+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
2022-08-05T15:16:24.399395+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
2022-08-05T15:16:24.399395+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
2022-08-05T15:16:24.399396+00:00 app[web.1]: File "<frozen importlib._bootstrap_external>", line 883, in exec_module
2022-08-05T15:16:24.399396+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
2022-08-05T15:16:24.399396+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.10/site-packages/gunicorn/workers/geventlet.py", line 20, in <module>
2022-08-05T15:16:24.399397+00:00 app[web.1]: from eventlet.wsgi import ALREADY_HANDLED as EVENTLET_ALREADY_HANDLED
2022-08-05T15:16:24.399397+00:00 app[web.1]: ImportError: cannot import name 'ALREADY_HANDLED' from 'eventlet.wsgi' (/app/.heroku/python/lib/python3.10/site-packages/eventlet/wsgi.py)
2022-08-05T15:16:24.399398+00:00 app[web.1]: ]
2022-08-05T15:16:24.399402+00:00 app[web.1]:
2022-08-05T15:16:24.550505+00:00 heroku[web.1]: Process exited with status 1
2022-08-05T15:16:24.671364+00:00 heroku[web.1]: State changed from starting to crashed
2022-08-05T15:31:37.077623+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/session" host=cheesecake142.herokuapp.com request_id=95dbcb95-8af7-42d6-8979-10d78af79447 fwd="120.29.69.149" dyno= connect= service= status=503 bytes= protocol=https
2022-08-05T15:31:37.460979+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=cheesecake142.herokuapp.com request_id=0ca459b8-538a-47f9-a4b4-296e21540db8 fwd="120.29.69.149" dyno= connect=
service= status=503 bytes= protocol=https

如果需要,我愿意提供关于这个问题的更多细节。

所以我自己刚才也遇到了这个问题,在消除与eventlet相关的错误方面,对我有效的是指定python版本(显然python 3.2.0与降级的eventlet版本不兼容,请阅读eventlet问题687(。我还有其他问题,但它们无关,所以这可能对你有用:

  • 在根目录中创建runtime.txt文件
    • 在文件中添加python-3.9.13

只是为了澄清我的包版本:

bidict==0.22.0
CacheControl==0.12.11
cachetools==5.2.0
certifi==2022.6.15
cffi==1.15.1
charset-normalizer==2.1.0
click==8.1.3
colorama==0.4.5
dnspython==1.16.0
eventlet==0.30.2
firebase-admin==5.2.0
Flask==2.2.1
Flask-SocketIO==5.2.0
gevent==21.12.0
gevent-websocket==0.10.1
google-api-core==2.8.2
google-api-python-client==2.55.0
google-auth==2.10.0
google-auth-httplib2==0.1.0
google-cloud-core==2.3.2
google-cloud-firestore==2.6.0
google-cloud-storage==2.5.0
google-crc32c==1.3.0
google-resumable-media==2.3.3
googleapis-common-protos==1.56.4
greenlet==1.1.2
grpcio==1.47.0
grpcio-status==1.47.0
gunicorn==20.1.0
httplib2==0.20.4
idna==3.3
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.1
msgpack==1.0.4
proto-plus==1.20.6
protobuf==3.20.1
pyasn1==0.4.8
pyasn1-modules==0.2.8
pycparser==2.21
pyparsing==3.0.9
python-decouple==3.6
python-dotenv==0.20.0
python-engineio==4.3.4
python-socketio==5.7.1
requests==2.28.1
rsa==4.9
six==1.16.0
uritemplate==4.1.1
urllib3==1.26.11
Werkzeug==2.2.1
zope.event==4.5.0
zope.interface==5.4.0

我的Procfile:

web: gunicorn --worker-class eventlet -w 1 application:app

希望这能奏效!

编辑:忘记澄清dnspython必须是1.16.0,您在这方面的错误是由于版本不低于2.0.0-然而,在将其降级到1.16.0后,我仍然得到了不同的错误,这些错误随着以上的解决方案而消失

试试这个:

pip install gunicorn==20.1.0 eventlet==0.30.2

相关内容

最新更新