2012-11-26 70 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錯誤...你能給我更詳細的信息,我可以做到這一點嗎?謝謝。 –