在 XMPP 和 django 之间同步用户
Posted
技术标签:
【中文标题】在 XMPP 和 django 之间同步用户【英文标题】:Synchronize users between XMPP and django 【发布时间】:2012-11-26 03:00:21 【问题描述】:我正在创建一个使用 django 作为后端的 ios 应用程序。我需要用户之间的聊天功能。
听说 XMPP 对实时通信有好处,我已经成功将 ejabberd 设置为 XMPP 服务器。但是我仍然很难处理细节: 我先创建了应用程序,然后创建了聊天功能,所以在我设置 ejabberd 之前,我的 django DB 中已经有用户了。我需要 ejabberd 针对我现有的数据库对用户进行身份验证,我几乎通过使用外部身份验证解决了这个问题。只有一个小问题,因为 ejabberd 似乎需要像 username@abc.com 这样的 jabber ID,而这里 abc 表示 ejabberd 的虚拟主机。我不知道也许我只能在我的服务器上使用一个虚拟主机(即域名)?但是一开始我要求用户使用来自不同域的电子邮件进行注册,例如gmail.com,yahoo.com,但 username@gmail.com@abc.com 不是有效的 jabber ID,所以我可以在这里做的一个小技巧是先将 @ 转换为 # 并处理它在后端的python脚本中正确。但也许我做错了?
另一个问题是关于用户个人资料。我也将用户信息存储在我的 django DB 中,例如显示名称、头像 url 等。我了解到,如果我想从 XMPP 服务器获取这些信息,我可以使用 vCard 模块。所以也许我需要在两个地方有重复的信息?而且我还没有弄清楚如何将用户信息从 DB 同步到 ejabberd。或者也许我只需要一个来源,即我的数据库,然后 iOS 客户端可以在需要时从后端查询信息?
我觉得 XMPP 不容易设置,在你的应用程序中使用它真的很受欢迎吗?特别是如果聊天不是您应用的主要功能,并且您不希望收到来自大量用户的大量消息?
【问题讨论】:
【参考方案1】:你写道:
但 username@gmail.com@abc.com 不是有效的 jabber ID
您应该转义用户 ID(即“username@gmail”)。
XEP 106 解释了如何转义 JID 的节点部分。
在 python 中,它看起来像这样:
def escape_node(node):
""" """
node.strip()
node = node.replace('\\', "\\5c")
node = node.replace(' ', "\\20")
node = node.replace('\"', "\\22")
node = node.replace('\&', "\\26")
node = node.replace('\'', "\\27")
node = node.replace('\/', "\\2f")
node = node.replace(':', "\\3a")
node = node.replace('<', "\\3c")
node = node.replace('>', "\\3e")
node = node.replace('@', "\\40")
return node
关于在 Django 中存储用户的详细信息。当您在 XMPP 中注册 Django 用户时,只需确保您还为他们注册了有效的 vCard。
当 Django 用户更改他的详细信息时,也要更新 vCard。
【讨论】:
感谢它非常有帮助。看来我只需要在 vCard 中存储照片 url 而不是实际数据,因为它更节省空间并且 iOS 客户端不必再次下载它(因为头像在其他地方使用,但 XMPPFramework 扩展不支持这还)。您能否指出一些链接,这些链接描述了如何“使用 python 从 django 更新 vCard(特别是 ejabberd)”,是否有任何关于如何编写 python 代码以与 ejabberd 通信的教程(我假设使用 ejabberdctl 不是正确的方式)? 我使用 Twisted 和 Wokkel 从 Python 与 XMPP 服务器进行通信。 wokkel.ik.nu。您也可以使用这些库创建带有 vCard 的 IQ 节。 我可以通过 twisted 和 wokkel 同步姓名和照片,但我只能在独立的应用程序中进行。当我将它与 django 放在一起时,似乎 reactor.run() 会阻塞,在单独的线程中运行它并没有帮助,因为 reactor.run() 只会在主线程中运行......如果我停止反应器并需要时再次运行它,然后我收到 ReactorNotRestartable 错误...您能否提供有关如何执行此操作的更多详细信息?谢谢。以上是关于在 XMPP 和 django 之间同步用户的主要内容,如果未能解决你的问题,请参考以下文章
一旦我可以使用 XMPP 列出用户,我如何在这些用户之间实现聊天?