我需要在 Django 中实现一个基于 XMPP 的实时聊天系统。经过同事的大量鞭策和想法,我们想出了这个。

使用机器人的方法:

  • 当访问者访问站点时。访客的 XMPP 客户端(在本例中为 Strophe.JS)开始与 XMPP 服务器的 XMPP-over-BOSH 连接并连接到名为 <visitor_id>@conference.demo.com 的房间。目前房间里没有其他人。
  • 访问者使用自定义访问者 ID 向 Django
  • 发出分析请求
  • Django View ,将访问者 ID 存储在名为 ActiveUsers 的表中。该表包含一个名为 status 的新字段。它将 status 设置为 INACTIVE
  • 此模型在 save 方法上发送信号。
  • 该信号被连接到 XMPP 服务器并加入房间 <visitor_id>@conference.demo.com 的机器人接收。现在我们在房间里有用户和机器人。
  • 站点支持人员登录到他们的 Web 界面。
  • 他们有 JS 代码,可以长时间轮询 Django 站点以检查 ActiveUsers 。它从表中获取行并显示它。 (我想过为此使用 django-pubsub)
  • 当访问者键入消息时,它通过 XMPP-over-BOSH 到达 XMPP 服务器,房间中的 jabber bot 看到此消息并将 ActiveUsers 表中的记录状态更新为 ACTIVE
  • 如前所述:站点支持人员有 JS 不断轮询此表。它开始闪烁 ow 以表明用户正在聊天。
  • 支持人员现在可以双击该行,开始与访客房间的 XMPP-over-BOSH 连接。它知道房间是 <visitor_id>@conference.demo.com
  • 机器人看到支持人员加入房间,更新 ActiveUsers 记录以显示 CHATTING 。这确保了房间内只能有支持人员,即房间被占用。
  • 机器人将消息记录到 Django 表
  • 当双方看到两个用户都离开房间时,它会删除记录。

  • ejabberd 或 openfire 将是 XMPP 服务器。
    Apache 是 Web 服务器,它运行 mod_wsgi 来为 Django 提供服务,而 mod_proxy 则将 XMPP-over-BOSh 请求代理到 XMPP 服务器。

    这样做听起来不错吗?有什么建议么?我担心 Django 系统的负载。

    (很长。对不起。)

    使用存在节的方法:

    在客户端,我正在使用支持在线状态的 Strophe JS 库,并且我添加了回调方法。我可以灵活地使用 ejabberd 或 openfire 作为我的 XMPP 服务器。 XMPP 服务器上有很多访问者——一些来自站点 A,一些来自站点 B,但他们都连接到同一个 XMPP 服务器。当访问者访问该站点时,他们以 <visitor_id>_<site_id>@demo.com 的身份连接到 XMPP 服务器,并且每个人都登录到一个名为 <visitor_id>@conference.demo.com 的房间。销售/支持人员也作为 <supportsale_id>_<site_id>@demo.com 连接到 XMPP 服务器。他们没有连接到任何聊天室。他们的名单上没有任何访客。

    显示用户已连接到该站点的一个好方法是向销售/支持人员传递一个存在节。只有来自同一站点的访问者和销售/支持人员才能相互通信,这就是为什么我在用户名中包含 <site_id> 以显示该人属于哪个站点。

    如果您的花名册上没有他,您似乎无法为用户订阅出席信息节。 (很合逻辑)。是否可以将连接到系统的站点的每个新用户自动添加到该站点的销售/支持人员名册中?这不会自动向销售/支持人员发出信号吗?我该如何实现这一点 - 有什么帮助吗?

    最佳答案

    我正是这样写的。它称为 Seshat 并在网站和 Jabber 服务器(我使用 ejabberd)之间使用“代理”机器人。它现在处于测试阶段,主要是因为它还没有在我公司之外进行过广泛的测试。

    注意:虽然自述文件特别提到了 Pyramid 网络框架,但核心系统也可以与 Django、TurboGears 或命令行系统一起工作。只是我只打包了示例代码,展示了如何将其与 Pyramid 集成。

    Seshat 正在积极开发中。如果您有任何功能要求,请告诉我。 :-)

    关于python - Django 中基于 XMPP 的实时聊天系统,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6584015/

    10-13 02:08