2008-12-04 8 views
4

J'ai deux projets Django sur le même serveur. Le premier a été lancé il y a plusieurs mois et a depuis recueilli des centaines de comptes d'utilisateurs. Le deuxième projet est lancé dans quelques jours, et nous aimerions que le deuxième projet permette aux utilisateurs de la première application de s'authentifier en utilisant les mêmes informations d'identification. Dans un premier temps, j'allais simplement vider la table user du premier projet dans le second projet, mais cela ne permettait pas une solution synchrone (l'utilisateur crée un compte sur le projet B, n'a pas alors accès au projet A). Est-ce que Django a un moyen de changer nativement les noms de bases de données (puisqu'ils sont sur le même serveur) pour l'authentification de l'utilisateur, puis de revenir à la base de données d'origine une fois l'authentification terminée? Si ce n'est pas le cas, quelle serait, selon vous, la meilleure solution pour mon problème? Aussi - nous utilisons MySQL.La meilleure façon de fusionner deux tables utilisateur de projets Django?

+0

Hrm. Les options ci-dessous sont "NON", "PEUT-ÊTRE" et "ATTENDRE". Pas rassurant. –

Répondre

3

Si vous attendez un certain temps, par la suite Django obtenir le soutien de plusieurs bases de données.

Mais pour l'instant, je pense que la meilleure solution à votre problème serait de synchroniser les tables d'utilisateur de la base de données deux après que les modifications soient faites. Vous pouvez utiliser les signaux de soutien pour gérer ceci:

from django.db import models 

def user_post_save(sender, instance, **kwargs): 
    ... run script to synchronize tables ... 
models.signals.post_save.connect(user_post_save, sender=User) 

Vous ne pourrez pas utiliser le ORM ... mais le dumping de la table source, puis laisser tomber la destination et l'importation dans ce serait relativement indolore. Cela pourrait certainement causer des problèmes de synchronisation, mais les transactions résoudraient la plupart du temps. Si les deux sites se chevauchent, je pourrais envisager de mettre en place un verrou en écriture sur la table Utilisateur lors de la mise à jour, et mettre en place une sorte de cycle spin-wait sur la méthode save() du modèle User (ou le signal pre_save) pour vérifier un verrou avant de terminer la sauvegarde. Cela garantirait que le signal post_save ne sera pas envoyé lors d'une synchronisation.

+0

Merci - cela ressemble à la meilleure solution pour l'instant. –

0

Django n'est actuellement pas compatible avec plusieurs bases de données (il existe un wikipage à ce sujet).

Une autre approche consisterait à écrire un module user authentication personnalisé pour le deuxième site Web qui effectuera des appels SQL à la première base de données de sites Web pour fournir la connexion. Lorsqu'un utilisateur du premier site se connecte au second Django, il créera un utilisateur sur le deuxième site. Mais cela pourrait avoir quelques problèmes avec le changement de nom complet et d'adresses e-mail, donc il ne pouvait être utilisé que pour avoir un nom d'utilisateur et un mot de passe. De plus, vos utilisateurs devront s'inscrire sur le premier site pour accéder à la seconde, vous aurez donc besoin de personnaliser votre inscription pour vous inscrire sur le premier.

+0

Je suis sûr qu'il serait possible de convaincre django.auth d'utiliser la base de données A avec un peu de piratage, mais la base de données B ne pourra pas utiliser l'ORM pour fournir des clés étrangères à la table utilisateur de DB A). –

2

Cela va probablement me tirer dessus; mais vous pouvez créer la table utilisateur du nouveau projet comme une simple vue du premier projet:

DROP TABLE proj2.users; 
CREATE VIEW proj2.users AS SELECT * FROM proj1.users; 
+0

ne fonctionnera pas en raison des collisions dans la colonne id unique – hop

+1

Pourquoi est-ce ?? Si la table a un auto_increment, cela devrait être enregistré dans la table proj1, donc pas de collisions – eliego

+0

pas une solution abstraite mais c'est facile et clair – oguzalb

1

soutien de plusieurs bases de données est maintenant disponible.

Questions connexes