【问题标题】:Combining websockets and WSGI in a python app在 python 应用程序中结合 websockets 和 WSGI
【发布时间】:2012-10-19 16:49:58
【问题描述】:

我正在进行一项科学实验,其中大约有两打测试人员玩回合制游戏,互相对抗。现在,它是一个带有 WSGI 接口的 Python Web 应用程序。我想通过 websockets 来增加可用性:当所有玩家完成他们的回合时,我想通知所有客户端更新他们的状态。现在,每个人要么等待转弯超时,要么不断重新加载并等待“转弯仍在进行中”错误消息不再出现(忙于等待,有效)。

我通读了多个 websocket 库的文档,了解 websocket 的工作原理,但我不确定混合 WSGI 和 websocket 的架构:我可以在同一个进程中拥有 websocket 和 WSGI 服务器吗(如果可以,如何,使用任何 websockets 库)并从 WSGI 处理程序调用my_websocket.send_message(),或者我应该有一个单独的 websockets 服务器并做一些 IPC?还是我根本不应该混合它们?

编辑,6 个月后:我最终启动了一个单独的 websockets 服务器进程(使用 Autobahn),而不是将它与 WSGI 服务器集成。原因是,将它们两者分开更容易和更清晰,并且从 WSGI 进程(服务器到服务器通信)中与 websockets 服务器进行对话是直接的,并且在第一次尝试时使用了websocket-client

【问题讨论】:

  • 你使用的是哪个 python web 框架,如果你正在使用一个?
  • 目前没有,但我愿意接受任何建议。
  • 好吧,在这种情况下,我第二次 oberstet 建议使用烧瓶。

标签: python websocket wsgi


【解决方案1】:

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

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

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

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

【讨论】:

  • 太棒了,这正是我想要的!另外,我还不知道 Websockets 之上的协议。
  • 要快速介绍 WAMP(=RPC+PubSub over WebSocket),请查看wamp.ws
  • 我部署为 Azure 应用服务并收到此错误消息:(索引):20 混合内容:“MYAPP.azurewebsites.net”处的页面通过 HTTPS 加载,但尝试连接到不安全的 WebSocket端点'ws://MYAPP.azurewebsites.net:8080/ws'。此请求已被阻止;此端点必须在 WSS 上可用。 window.onload @ (index):20 (index):20 Uncaught DOMException: Failed to construction 'WebSocket': 不安全的 WebSocket 连接可能无法从通过 HTTPS 加载的页面启动。在 window.onload (MYAPP.azurewebsites.net/:20:23)
  • websocket 规范 (rfc6455) 明确禁止充当 websocket 客户端的 web 浏览器让带有打开 websocket 连接的 JS 的 HTML 页面通过 HTTPS 加载(这是安全的) 处于非安全模式(WS 而不是 WSS)。解决方案:要么在 HTTP 端点上托管您的 HTML/JS 等,要么通过 WSS 连接到您的 websocket 服务器
【解决方案2】:

但我不确定混合 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 2014-04-04
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    相关资源
    最近更新 更多