Ios 在XMPP和django之间同步用户

Ios 在XMPP和django之间同步用户,ios,django,xmpp,user-profile,Ios,Django,Xmpp,User Profile,我正在创建一个iOS应用程序,它使用django作为我的后端。我需要有一个用户之间的聊天功能 我听说XMPP适合实时通信,我已经成功地将ejabberd设置为XMPP服务器。但我仍然很难处理细节: 我先创建了应用程序,然后创建了聊天功能,所以在设置ejabberd之前,django DB中已经有用户了。我需要ejabberd根据我现有的数据库对用户进行身份验证,我几乎通过使用外部身份验证解决了这个问题。这里只有一个小问题,因为ejabberd似乎需要像jabber一样的jabber IDuser

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

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

另一个问题是关于用户配置文件。我还将用户信息存储在django数据库中,例如显示名称、化身url等。我了解到,如果我想从XMPP服务器获取这些信息,我可以使用vCard模块。也许我需要在两个地方复制信息?我仍然没有弄清楚如何将用户信息从DB同步到ejabberd。或者我只需要有一个数据源,那就是我的数据库,然后iOS客户端就可以在需要的时候从后端查询信息了

我觉得XMPP不容易安装,在你的应用程序中使用它真的很流行吗?尤其是如果聊天不是你应用程序的主要功能,并且你不希望收到大量用户的大量信息时?

你写道:

但是username@gmail.com@abc.com不是有效的jabber ID

您应该转义用户id(即“username@gmail"

解释如何转义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
def escape_节点(节点):
""" """
node.strip()
node=node.replace(“\\”,“\\5c”)
节点=节点。替换(“”,\\20”)
node=node.replace(“\”,“\\22”)
node=node.replace('\&',“\\26”)
node=node.replace('\'',\\27“)
节点=节点。替换(“\/”,“\\2f”)
node=node.replace(“:”,“\\3a”)
节点=节点。替换(“”,\\3e)
node=node.replace('@',“\\40”)
返回节点
关于在Django中存储用户的详细信息。当您在XMPP中注册Django用户时,只需确保您也为他们注册了有效的vCard

当Django用户更改其详细信息时,请同时更新vCard。

您写道:

但是username@gmail.com@abc.com不是有效的jabber ID

您应该转义用户id(即“username@gmail"

解释如何转义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
def escape_节点(节点):
""" """
node.strip()
node=node.replace(“\\”,“\\5c”)
节点=节点。替换(“”,\\20”)
node=node.replace(“\”,“\\22”)
node=node.replace('\&',“\\26”)
node=node.replace('\'',\\27“)
节点=节点。替换(“\/”,“\\2f”)
node=node.replace(“:”,“\\3a”)
节点=节点。替换(“”,\\3e)
node=node.replace('@',“\\40”)
返回节点
关于在Django中存储用户详细信息。在XMPP中注册Django用户时,只需确保也为他们注册了有效的vCard


当Django用户更改其详细信息时,请同时更新vCard。

谢谢,这非常有帮助。似乎我只需要在vCard中存储照片url而不是实际数据,因为它更节省空间,并且iOS客户端不必再次下载它(因为化身在其他地方使用,但XMPPFramework扩展尚不支持)。你可以给我指一些链接,这些链接描述了如何“使用python从django更新vCard(特别是ejabberd)”,是否有关于如何编写python代码来与ejabberd通信的教程(我假设使用ejabberdctl不是正确的方法)?我使用Twisted和Wokkel从python与XMPP服务器通信。你也可以使用这些库创建一个带有vCard的IQ节。我可以通过twisted和wokkel同步姓名和照片,但我只能在一个独立的应用程序中完成。当我把它和django放在一起时,似乎reactor.run()会阻塞,在一个单独的线程中运行它并没有帮助,因为reactor.run()只会在主线程中运行。。。如果我停止反应器,在需要的时候再次运行它,那么我会得到反应或不可恢复的错误。。。你能给我更详细的信息说明我是如何做到这一点的吗?谢谢。谢谢。这很有帮助。似乎我只需要在vCard中存储照片url而不是实际数据,因为它更节省空间,并且iOS客户端不必再次下载它(因为化身在其他地方使用,但XMPPFramework扩展尚不支持)。你可以给我指一些链接,这些链接描述了如何“使用python从django更新vCard(特别是ejabberd)”,是否有关于如何编写python代码来与ejabberd通信的教程(我假设使用ejabberdctl不是正确的方法)?我使用Twisted和Wokkel从python与XMPP服务器通信。你也可以使用这些库创建一个带有vCard的IQ节。我可以通过twisted和wokkel同步姓名和照片,但我只能在一个独立的应用程序中完成。当我把它和django放在一起时,似乎reactor.run()会阻塞,在一个单独的线程中运行它并没有帮助,因为reactor.run()只会在主线程中运行。。。如果我停止反应堆,在需要的时候再次运行