2016-01-31 3 views
1

Je construis une application avec python-social-auth pipline personnalisée pour la connexion via facebook. La situation est si simple, je dois rediriger l'utilisateur de la fonction non-vue à l'URL avec paramètre.Django rediriger/appeler avec le paramètre d'une autre fonction

Voici mes urls connexes:

url(r'^.*', login, name = 'login'), 
url(r'^logout/.*', logout, name = 'FBAuth.views.logout'), 
url(r'^/new_user/.*', login, {'new_user':1}, name = 'new_user'), 
url(r'^succeeded/.*', login, {'new_user':2}, name = 'succeeded'), 

de views.py:

def login(request, new_user=None): 
    logger.debug("I'm in login view, new_user = %s", new_user) 
    message = 'Welcome to application!' 
    if new_user: 
     if new_user == 1: #new one 
      message = 'Wellcome to our app! Thanks for registration' 
     else: 
      if new_user == 2: #loggined 
       message = "Successfully logged in" 
      else: 
       message = new_user 
    context = RequestContext(request, { 
     'request': request, 'user': request.user, 'message' : message}) 
    return render_to_response('login.html', context_instance=context) 

custom.py:

def check_if_exists(strategy, request, *args, **kwargs): 
    login_type = strategy.request.GET.get('login_type') 

    if kwargs['is_new']: 
     ... 
     some code 
     ... 
    else: 
     #if login_type == 2: 
      #raise AuthAlreadyAssociated   #need to add message 
      new_user = 1 
      #return redirect('/new_user/') 
      #return redirect('/new_user/', {'new_user' : new_user}) 
      return login(new_user=1) 
      #return redirect(reverse('new_user')) 
      #reverse('FBAuth.views.login', kwargs={'new_user' : new_user}) #, new_user=new_user) #, args =(new_user,)) 
      #reverse(redirect_uri, args=(backend,)) 
    return None 

Voici mon pipeline auth:

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', 
    'FBAuth.facebook.check_if_exists',  
    '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', 
) 

Les pipelene cals par url:

href="{% url 'social:begin' 'facebook' %}?next={{ request.path }}&login_type={{1}}" 

j'ai essayé un million de variantes, rien ne fonctionne. La redirection échoue toujours ou je reçois new_user = None à mon avis.

S'il vous plaît, aidez-moi à trouver un moyen de passer mon paramètre.

Note: J'ai aussi essayé:

return redirect('/new_user/1/') 

et

return redirect('/new_user/?new_user=1/') 

pour l'url:

url(r'^/new_user/(?P<new_user>)/$', login, name = 'new_user'), 

La page est ouverte, mais aucun message (new_user à None)

+0

Qu'est-ce qui appelle cette fonction 'check_if_exists'? –

+0

Cela fait partie du pipeline d'authentification de python-social-auth, il appelle de la fonction suivante, je vais l'ajouter à la description. –

+0

Avec le code actuel (c'est-à-dire avec 'return login (new_user = 1)'), que se passe-t-il? Et que devrait-il se passer à la place exactement? –

Répondre

0

Je pense que le problème réside dans la manière dont vous gérez les URL.

url(r'^/new_user/(?P<new_user>)/$', login, name = 'new_user') 

Lors de la redirection, utilisez ceci.

return redirect('/new_user/1/') 

Ceci n'a pas été testé. J'espère que cela t'aides.

+0

Ai-je besoin d'analyser cela à mon avis d'une autre façon? –

+0

Aucun changement de vue requis. Votre vue devrait avoir une variable _new_user_ définie à 1. Je pense que c'est ce que vous vouliez, selon votre code. –

+0

Mais mon 'new_user' est toujours' None' –