【问题标题】:WebSockets and WSGI together through GunicornWebSockets 和 WSGI 通过 Gunicorn 一起使用
【发布时间】:2013-07-12 04:34:58
【问题描述】:

是否可以使用 Gunicorn 在一个(Flask)应用程序中同时处理 WebSockets 和常规 WSGI 视图?

我知道如何使用 Gevent WSGI 服务器让 websockets 工作,并且我可以使用 Gunicorn 和 gevent 工作人员运行常规 WSGI 应用程序,但是当我尝试使用 Gunicorn 从一个应用程序同时为这两者提供服务时,我得到了一个错误:

ValueError: View 函数没有返回响应

是否可以使用 gunicorn 从一个应用程序同时提供这两种服务?我计划最终将这一切都放在 nginx 之后,我不反对将套接字拆分为另一个应用程序并让两者进行通信,只要这不需要太多额外的系统资源。在那之前,有没有办法做到这一点?

编辑:

我想出了如何让它发挥作用。关键是 1) 更改 gevent 的日志记录功能和 2) 确保向 gunicorn 指定我正在使用 geventWebSocketWorker 类工作者。

我在这个网站上找到了这个答案的一部分:http://d.hatena.ne.jp/Malan/20121007

为了记录,我认为让一台服务器运行 tornado/twisted/autobahn(感谢 Jordan)和另一台运行我的 WSGI 东西可能是一个更好的主意。但这不是我想要的:)

def log_request(self):
    log = self.server.log
    if log:
        if hasattr(log, "info"):
            log.info(self.format_request() + '\n')
        else:
            log.write(self.format_request() + '\n')

import gevent        
gevent.pywsgi.WSGIHandler.log_request = log_request
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer

sudo gunicorn -c gunicorn_config.py -k     "geventwebsocket.gunicorn.workers.GeventWebSocketWorker" router:app       

【问题讨论】:

  • 这与您正在做的事情有关吗? stackoverflow.com/questions/13137449/…
  • 当然,但如果可能的话,我想避免在这个项目中使用扭曲或龙卷风。
  • 你应该抛弃 gunicorn 转而使用 uwsgi。
  • @user37203 你能否为该建议提供更多背景信息?
  • uwsgi 比 gunicorn 更快、更稳定、更小。它是一个用 C 编写的 wsgi 服务器,可以以多种方式运行 python wsgi 应用程序。 Nginx 有一个 uwsgi 后端,这是运行它的建议方式。 ngnix -> uwsgi -> python app 试试看,它正在慢慢成为行业标准。

标签: python websocket flask gevent gunicorn


【解决方案1】:

Flask-Sockets 可能会有所帮助。

【讨论】:

    猜你喜欢
    • 2012-08-17
    • 2013-06-07
    • 2020-12-04
    • 1970-01-01
    • 2012-09-09
    • 2015-10-01
    • 2016-11-06
    • 2021-09-06
    • 2015-01-12
    相关资源
    最近更新 更多