2012-11-26 4 views
1

Je crée une application iOS qui utilise django comme backend. Je dois avoir une fonctionnalité de chat entre les utilisateurs. J'ai entendu dire que XMPP est bon pour la communication en temps réel, et j'ai réussi à configurer ejabberd en tant que serveur XMPP. Mais j'ai encore du mal à gérer les détails:
J'ai créé l'application d'abord, puis la fonction de discussion, donc avant de configurer ejabberd, il y a déjà des utilisateurs dans ma base de données django. J'ai besoin d'ejabberd pour authentifier les utilisateurs par rapport à ma base de données existante et j'ai presque résolu cela en utilisant l'authentification externe. Il y a seulement un petit problème, comme ejabberd semble exiger l'ID jabber comme [email protected], et ici abc signifie l'hôte virtuel de ejabberd. Je ne sais pas peut-être que je ne pouvais utiliser qu'un seul hôte virtuel sur mon serveur (qui est le nom de domaine)? Mais au début, j'ai demandé à l'utilisateur de s'enregistrer en utilisant des courriels provenant de différents domaines, bien sûr, par exemple. gmail.com, yahoo.com, mais nom d'utilisateur @ gmail.com @ abc.com n'est pas un ID jabber valide, alors peut-être un petit truc que je peux faire ici est de convertir d'abord @ à # et le gérer correctement dans le python script dans le backend. Mais peut-être que je l'ai fait totalement faux?Synchroniser les utilisateurs entre XMPP et django

Un autre problème concerne le profil utilisateur. J'ai également stocké les informations de l'utilisateur dans ma base de données django, par ex. J'ai appris que je pourrais utiliser le module vCard si je veux obtenir ces informations du serveur XMPP. Alors peut-être que j'ai besoin d'avoir des informations dupliquées à deux endroits? Et encore je n'ai pas compris comment synchroniser les informations d'utilisateur de DB à ejabberd. Ou peut-être que j'ai juste besoin d'avoir une seule source, qui est ma base de données, et le client iOS pourrait alors interroger les informations du backend chaque fois que nécessaire?

J'ai l'impression que XMPP n'est pas facile à installer, est-il vraiment populaire de l'utiliser dans vos applications? Surtout si le chat n'est pas la fonctionnalité principale de votre application et que vous ne vous attendez pas à recevoir d'énormes messages d'un grand nombre d'utilisateurs?

Répondre

1

Vous avez écrit:

mais username @ gmail.com @ abc.com n'est pas une pièce d'identité valide jabber

Vous êtes censé échapper à l'ID utilisateur (par exemple "nom d'utilisateur @ gmail").

XEP 106 explique comment vous devriez échapper à la partie de nœud d'un JID.

En python, il ressemblerait à quelque chose comme ceci:

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 

En ce qui concerne le stockage des informations de vos utilisateurs dans Django. Lorsque vous enregistrez vos utilisateurs Django dans XMPP, assurez-vous que vous avez également enregistré des vCards valides pour eux.

Lorsqu'un utilisateur Django modifie ses informations, mettez également à jour la vCard.

+0

merci c'est très utile. il semble que je n'ai besoin de stocker que l'URL de la photo au lieu des données réelles dans vCard car il est plus efficace et le client iOS ne doit pas le télécharger à nouveau (car l'avatar est utilisé ailleurs, mais les extensions XMPPFramework ne supportent pas ceci encore). pourriez-vous me pointer vers des liens qui décrivent comment "mettre à jour vCard (spécifiquement ejabberd) à partir de django en utilisant python", existe-t-il un tutoriel sur comment écrire du code python pour communiquer avec ejabberd en général (je suppose qu'ejabberdctl façon)? –

+0

J'utilise Twisted et Wokkel pour communiquer avec le serveur XMPP de Python. http://wokkel.ik.nu. Vous pouvez également utiliser ces bibliothèques pour créer une strophe IQ avec une vCard. –

+0

J'ai été capable de synchroniser le nom et les photos via Twisted et Wokkel, mais je ne pouvais le faire que dans une application autonome. quand je l'ai mis avec django, il semble que reactor.run() bloquerait, l'exécuter dans un thread séparé n'a pas aidé car reactor.run() ne fonctionnerait que dans le thread principal ... et si j'arrête le réacteur et exécutez-le à nouveau si nécessaire, puis j'ai ReactorNotRestartable erreur ... pourriez-vous donner des informations plus détaillées sur la façon dont je peux le faire? Merci. –

Questions connexes