在XMPP和django之间同步用户

时间:2012-11-26 03:00:21

标签: ios django xmpp user-profile

我正在创建一个使用django作为后端的iOS应用。我需要在用户之间建立聊天功能。

我听说XMPP适合实时通信,我已成功将ejabberd设置为XMPP服务器。但我仍然很难处理细节:
我首先创建了应用程序,然后创建了聊天功能,所以在设置ejabberd之前,我的django数据库中已有用户。我需要ejabberd来根据我现有的数据库对用户进行身份验证,我几乎通过使用外部身份验证解决了这个问题。只有一个小问题,因为ejabberd似乎需要像 username@abc.com 这样的jabber ID,而这里 abc 意味着ejabberd的虚拟主机。我不知道也许我只能在我的服务器上使用一个虚拟主机(这是域名)?但是在开始时我要求用户使用来自不同域的电子邮件进行注册,例如gmail.com,yahoo.com,但用户名@ gmail.com @ abc.com 不是一个有效的jabber ID,所以我可以做的一个小技巧是将@转换为#并处理它正确地在后端的python脚本中。但也许我完全错了?

另一个问题是关于用户个人资料。我也将用户信息存储在我的django DB中,例如显示名称,头像URL等。如果我想从XMPP服务器获取这些信息,我了解到我可以使用vCard模块。那么也许我需要在两个地方有重复的信息?而且我还没想出如何将用户信息从DB同步到ejabberd。或者我可能只需要一个源,这是我的数据库,然后iOS客户端可以在需要时从后端查询信息?

我觉得XMPP不易设置,在您的应用中使用它真的很受欢迎吗?特别是如果聊天不是你的应用程序的主要功能,你不希望有来自大量用户的巨大消息?

1 个答案:

答案 0 :(得分:1)

您写道:

  

但是用户名@ 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。