flask-socketio 在安装了 eventlet 的 aws 上不起作用

Posted

技术标签:

【中文标题】flask-socketio 在安装了 eventlet 的 aws 上不起作用【英文标题】:flask-socketio does not work on aws with eventlet installed 【发布时间】:2018-07-27 18:09:27 【问题描述】:

我目前在使用带有 eventlet 的 flask-socketio 运行 Flask 应用程序时遇到问题。当我在没有 eventlet 的情况下推送到 AWS 时,我的应用程序运行良好。这很棒,但是我希望我的应用程序可以投入生产,并且在没有 eventlet 的情况下运行 flask-socketio 是缓慢而乏味的。我所做的是将我的应用程序分解为一个具有最低要求和代码的较小的烧瓶应用程序,以测试到底是什么错误(下面提供了该应用程序的链接)。如果您摆脱 eventlet 及其在 requirements.txt 中的依赖项,那么这个较小的应用程序可以在 aws 上运行,并且如果您将它们留在那里,它将中断。经过大量调试和测试,我仍然无法弄清楚错误的来源。任何帮助将不胜感激。

在 AWS 上,我收到以下通用服务器错误:

内部服务器错误

服务器遇到内部错误或配置错误,无法完成您的请求。

请通过 root@localhost 联系服务器管理员,告知他们此错误发生的时间,以及您在此错误之前执行的操作。

服务器错误日志中可能会提供有关此错误的更多信息。

在 AWS eb 日志中,我看到以下内容:

[Fri Feb 16 17:45:47.269584 2018] [:error] [pid 4233]     import re
[Fri Feb 16 17:45:47.269592 2018] [:error] [pid 4233]   File "/opt/python/run/venv/lib64/python3.6/re.py", line 142, in <module>
[Fri Feb 16 17:45:47.269750 2018] [:error] [pid 4233]     class RegexFlag(enum.IntFlag):
[Fri Feb 16 17:45:47.269762 2018] [:error] [pid 4233] AttributeError: module 'enum' has no attribute 'IntFlag'
[Fri Feb 16 17:45:48.274188 2018] [:error] [pid 4233] [remote 127.0.0.1:148] mod_wsgi (pid=4233): Target WSGI script '/opt/python/current/app/application.py' cannot be loaded as Python module.
[Fri Feb 16 17:45:48.274233 2018] [:error] [pid 4233] [remote 127.0.0.1:148] mod_wsgi (pid=4233): Exception occurred processing WSGI script '/opt/python/current/app/application.py'.

这是包含我的项目代码的 github 存储库:

https://github.com/Freddie-Pike/Flask-SocketIO-AWS

编辑:此设置适用于本地主机。它只是在 AWS 上不起作用。

【问题讨论】:

忽略错误,如果您正在尝试这样做,则不能将 websockets 与 Apache/mod_wsgi 一起使用。 我没有使用 Apache/mod_wsgi,我应该在帖子中指出(我现在将对其进行编辑),此设置适用于 localhost。 如果您没有使用 mod_wsgi,为什么它会在您包含的错误日志中显示 mod_wsgi 错误。 你是 100% 正确的格雷厄姆。尽管我自己没有安装 mod_wsgi,但我没有意识到弹性 beanstalk python 平台自己运行它。谢谢。来源:***.com/questions/42636073/… 【参考方案1】:

这个错误:

[Fri Feb 16 17:45:47.269584 2018] [:error] [pid 4233]     import re
[Fri Feb 16 17:45:47.269592 2018] [:error] [pid 4233]   File "/opt/python/run/venv/lib64/python3.6/re.py", line 142, in <module>
[Fri Feb 16 17:45:47.269750 2018] [:error] [pid 4233]     class RegexFlag(enum.IntFlag):
[Fri Feb 16 17:45:47.269762 2018] [:error] [pid 4233] AttributeError: module 'enum' has no attribute 'IntFlag'

很可能与 SocketIO 无关。我的猜测是您的应用程序有一个名为 enum 的模块或包,它隐藏了 Python 3.6 中的 enum 包。删除或重命名您的 enum,以便 Python 可以看到自己的 enum,错误就会消失。

此外,正如 Graham 所说,您不能将 apache 和 mod_wsgi 与 websockets 一起使用。您可以查阅 Flask-SocketIO 文档以获取支持的部署配置列表。

【讨论】:

首先,你的教程很棒!其次,第一个错误与 SocketIO 无关。我现在正在研究如何以 正确 方式部署到 Flask-SocketIO。感谢您的回复!【参考方案2】:

抱歉,我上传了使用旧 setuptools 创建的包,它不支持 enum34;python_version&lt;"3.4" in install_requirements 中的这种语法。

请尝试更新pip install -U eventlet,刚刚发布的 0.22.1 应该可以解决这个问题。

Github 上的相关问题(如果 0.22.1 没有修复,请订阅新闻):https://github.com/eventlet/eventlet/issues/463

【讨论】:

感谢 temoto!使用最新版本的 eventlet 绕过了我得到的运行时错误。 EB 实例现在运行,但由于我的部署设置不正确,因此未发送套接字消息。

以上是关于flask-socketio 在安装了 eventlet 的 aws 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

flask-socketio 在安装了 eventlet 的 aws 上不起作用

Flask 和 Flask-SocketIO 集成和导入错误

网站后端_Flask-第三方库.利用Flask-Socketio扩展构建实时流应用?

结合manage.py,在flask项目中使用 flask-socketio

Flask-SocketIO发送图像

[翻译] flask-SocketIO