2016-02-04 1 views
0

Je suis nouveau dans l'environnement de développement de Django. S'il vous plaît aidez-moi dans la mise en œuvre de scénarios comme suit dans l'application Django.Django: Comment identifier par quel utilisateur de lien a fait l'authentification sociale?

Dans ma page web, il y a des liens disponibles pour faire un login/login social en utilisant le module python-social-auth (pour facebook et google). Il y a deux types d'utilisateurs dans mon système, TypeA et TypeB.

Dans la page Web il y aura différents liens pour chacun de type (comme TypeA-Facebook-Login, TypeB-Facebook-Login).

Lorsque jamais un utilisateur est créé par le service python-auth-social, une entrée User est ajoutée en utilisant django.dispatch.receiver Je veux faire l'entrée à la table TypeAUser ou TypeBUser.

* Alors, comment puis-je comprendre par quel lien l'utilisateur est inscrit?

J'ai essayé de suivre avec un paramètre supplémentaire dans les liens d'authentification sociale, mais comment puis-je accéder à cette information plus tard?

<a href="{% url 'social:begin' 'facebook' %}?next={{request.path}}&profile_type=typea"> 
Login with faceboook</a> 

Voici comment j'ai écrit la fonction @reciver.

@receiver(post_save, sender=User,dispatch_uid="add_user_profile") 
def add_user_profile(sender,instance, **kwargs): 

Beaucoup de mercis, pour les suggestions et les entrées.

+0

Comment avez-vous mis en place 'contrib.auth' avec deux versions de modèles d'utilisateur ? – khajvah

+0

@khajvah: Je n'ai pas modifié ** contrib.auth module **, juste ajouté de nouveaux modèles comme 'TypeAUser' et' TypeBUser', qui a 'models.OneToOneField ('auth.User', primary_key = True)' un champ d'utilisateur. – Dipak

+0

Je ne pense pas, c'est une bonne solution. Je vous suggère de créer une nouvelle table 'UserTypes', puis d'ajouter une nouvelle clé étrangère de' auth.User' à cette nouvelle table. – khajvah

Répondre

0

Semble être moi-même compris pour mettre en œuvre ce concept par SOCIAL_AUTH_PIPELINE basé sur la documentation suivante reference.

suivant est les modifications que je l'ai fait: Ajouté SOCIAL_AUTH_PIPELINE en setting.py avec la coutume d'un pipeline

# social authentication pipeline 
SOCIAL_AUTH_PIPELINE = (
    'social.pipeline.social_auth.social_details', 
    'social.pipeline.social_auth.social_uid', 
    'social.pipeline.social_auth.auth_allowed', 
    'social.pipeline.social_auth.social_user', 
    'social.pipeline.user.get_username', 
    'social.pipeline.user.create_user', 
    'social.pipeline.social_auth.associate_user', 
    'social.pipeline.social_auth.load_extra_data', 
    'social.pipeline.user.user_details', 
# custom pipeline 
    'user_profile.pipeline.create_user_profile' 
) 

a également ajouté FIELDS_STORED_IN_SESSION dans settings.py, comme suit

FIELDS_STORED_IN_SESSION = ['profile_type'] 

Puis, en user_profile.pipeline.py, fonction définie create_user_profile comme suit:

def create_user_profile(strategy, details, user=None, is_new=False, *args, **kwargs): 
    print(strategy.session_get('profile_type')) 

Maintenant à partir de l'objet de stratégie, je peux accéder à la valeur personnalisée pour créer un autre type de profil utilisateur. Link of reference

Sur le lien principal dans lequel l'utilisateur clique, a ajouté un argument supplémentaire à la fin de l'URL comme suit:

http://domain.name.com/signupurl?profile_type=type1 
http://domain.name.com/signupurl?profile_type=type2