在python应用程序中组合websockets和WSGI

时间:2012-10-30 10:52:35

标签: python websocket wsgi

我正在进行一项科学实验,大约有二十多名测试人员互相进行回合制比赛。现在,它是一个带有WSGI接口的Python Web应用程序。我想用websockets增强可用性:当所有玩家完成转弯时,我想通知所有客户更新他们的状态。现在,每个人都必须等待转弯超时,或者不断重新加载并等待转弯仍在进行中#34;错误消息不再出现(忙等待,有效)。

我通读了多个websocket库'文档和我理解websockets如何工作,但我不确定混合WSGI和websockets的架构:我可以在同一个进程中有一个websockets和一个WSGI服务器(如果是这样,如何使用任何websockets库并且只是从WSGI处理程序调用{​​{1}},或者我应该有一个单独的websockets服务器并做一些IPC?或者我不应该混用它们吗?

编辑,6个月后:我最终启动了一个单独的websockets服务器进程(使用Autobahn),而不是将其与WSGI服务器集成。原因是将它们中的两个分开更加容易和清晰,并且从WSGI进程(服务器到服务器通信)与websockets服务器交谈是直截了当的,并使用{{3}进行了第一次尝试。 }。

2 个答案:

答案 0 :(得分:14)

这是一个做你想做的事的例子:

它运行一个WSGI Web应用程序(在这种情况下基于Flask,但可以是符合WSGI的任何内容)以及1个服务器和1个端口下的WebSocket服务器。

您可以从Web处理程序中发送WS消息。 Autobahn还在WebSocket之上提供PubSub,这极大地简化了通知的发送(通过WampServerProtocol.dispatch),就像你的情况一样。

披露:我是Autobahn的作者并为Tavendo工作。

答案 1 :(得分:1)

但是我不确定用于混合WSGI和websockets的体系结构

我做到了

使用WSocket

简单的WSGI HTTP + Websocket服务器,框架,中间件和应用程序。

包含

  • 包含服务器(WSGI)-可与任何WSGI框架一起使用
  • 中间件-为任何WSGI框架添加Websocket支持
  • 框架-简单的Websocket WSGI Web应用程序框架
  • App-基于事件的Websocket通信应用 使用外部服务器时,某些客户端(如Firefox)需要http 1.1服务器。用于中间件,框架,应用程序
  • 处理程序-将Websocket支持添加到wsgiref(Python内置WSGI服务器)
  • 客户-即将推出...

常见功能

  • 只有少于1000行的单个文件
  • 支持websocket子协议
  • 支持websocket消息压缩(如果客户要求,可以使用
  • 接收和发送pong和ping消息(带有自动pong发件人)
  • 接收和发送二进制或文本消息
  • 适用于带或不带面具的邮件
  • 支持关闭消息
  • 自动和手动关闭

使用Bottle Web框架和WSocket中间件的示例

from bottle import request, Bottle
from wsocket import WSocketApp, WebSocketError, logger, run
from time import sleep

logger.setLevel(10)  # for debugging

bottle = Bottle()
app = WSocketApp(bottle)
# app = WSocketApp(bottle, "WAMP")

@bottle.route("/")
def handle_websocket():
    wsock = request.environ.get("wsgi.websocket")
    if not wsock:
        return "Hello World!"

    while True:
        try:
            message = wsock.receive()
            if message != None:
                print("participator : " + message)
                
            wsock.send("you : "+message)
            sleep(2)
            wsock.send("you : "+message)
            
        except WebSocketError:
            break
            
run(app)