2012-11-26 49 views
1

我正在创建一个使用django作为我的后端的iOS应用程序。我需要在用户之间有一个聊天功能。在XMPP和django之间同步用户

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

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

我觉得XMPP不易安装,它在你的应用程序中使用真的很流行吗?特别是如果聊天不是您的应用程序的主要功能,并且您不希望大量用户发送大量消息?

回答

1

您写道:

但用户名@ gmail.com @ abc.com是不是一个有效的Jabber ID

你应该逃避用户ID(即 “用户名@ gmail的” )。

XEP 106解释了您应如何逃避JID的节点部分。

在蟒蛇,它会是这个样子:

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。

+0

感谢这非常有帮助。看来我只需要存储照片url而不是vCard中的实际数据,因为它更节省空间,iOS客户端不必再次下载它(因为头像在其他地方使用,但XMPPFramework扩展不支持这还没有)。你可能会指向我的一些链接,描述如何“更新vCard(ejabberd专门)从Django使用python”,是否有任何教程如何编写Python代码与ejabberd进行通信(我假设使用ejabberdctl不是正确的办法)? –

+0

我使用Twisted和Wokkel从Python与XMPP服务器进行通信。 http://wokkel.ik.nu。您也可以使用这些库创建带有vCard的IQ节。 –

+0

我能够通过扭曲和wokkel同步名称和照片,但我只能在独立应用程序中完成。当我把它与Django放在一起时,看起来reactor.run()会阻塞,在分离的线程中运行它并没有帮助,因为reactor.run()只会在主线程中运行...并且如果我停止了reactor并且在需要的时候再次运行,然后我得到了ReactorNotRestartable错误...你能给我更详细的信息,我可以做到这一点吗?谢谢。 –