web-dev-qa-db-fra.com

plusieurs systèmes d’authentification configurés et doivent donc fournir l’argument `backend` ou définir l’attribut` backend`

tout d'abord, je suis nouveau sur Django/python.

j'essaie de créer un site Web de connexion permettant à l'utilisateur de créer un compte et de le vérifier par courrier électronique ou directement via fb ou google (Oauth).

je reçois le message d'erreur lorsque je clique sur l'URL de validation envoyée à l'email.

erreur:

ValueError at /activate/Mjk/4p1-dcc5f7ed2e7c847fe362/

You have multiple authentication backends configured and therefore must 

provide the `backend` argument or set the `backend` attribute on the user.

Request Method: GET

Request URL:    http://127.0.0.1:8000/activate/Mjk/4p1-dcc5f7ed2e7c847fe362/
Django Version: 1.11.3

Exception Type: ValueError

Exception Value:    

You have multiple authentication backends configured and therefore must provide the `backend` argument or set the `backend` attribute on the user.
Exception Location: /usr/local/lib/python2.7/dist-packages/Django/contrib/auth/__init__.py in login, line 149
Python Executable:  /usr/bin/python
Python Version: 2.7.12
Python Path:    
['/home/gaby/Django projects/simple-signup-master/profile-model',
 '/usr/local/lib/python2.7/dist-packages/virtualenv-15.1.0-py2.7.Egg',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/home/gaby/.local/lib/python2.7/site-packages',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PILcompat',
 '/usr/lib/python2.7/dist-packages/gtk-2.0',
 '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
Server time:    Wed, 30 Aug 2017 12:34:31 +0000

mysite/settings

AUTHENTICATION_BACKENDS = (

 'social_core.backends.facebook.FacebookOAuth2',
 'social_core.backends.google.GoogleOAuth2',

 'Django.contrib.auth.backends.ModelBackend',

)

c'est la fonction appelée quand je reçois l'erreur

    def activate(request, uidb64, token):
    try:
    uid = force_text(urlsafe_base64_decode(uidb64))
    user = User.objects.get(pk=uid)
    except (TypeError, ValueError, OverflowError, User.DoesNotExist):
    user = None

    if user is not None and account_activation_token.check_token(user, 
    token):
    user.is_active = True
    user.profile.email_confirmed = True
    user.save()
    login(request, user)
    return redirect('home')
else:
    return render(request, 'account_activation_invalid.html')

j'ai commencé à recevoir l'erreur après avoir ajouté le login de serment via fb, google . si je supprime 'social_core.backends.facebook.FacebookOAuth2', 'social_core.backends.google.GoogleOAuth2' de AUTHENTICATION_BACKENDS, la confirmation par courrier électronique fonctionne à nouveau.

j'ai cherché en ligne et ici aussi la seule solution que j'ai trouvée était ci-dessous mais cela n'a pas résolu mon problème.

ici

10
gaby awad

Donc, dans mon cas, je n'avais tout simplement pas enregistré l'utilisateur. Aussi login(request, user, backend='Django.contrib.auth.backends.ModelBackend')

Pour enregistrer un utilisateur:

# register.py
from Django.contrib.auth.models import User
cfg_user = 'user'
user = User.objects.create_user(username=cfg_user,
                                 email='[email protected]',
                                 password='password')
print('registered user '+cfg_user)

# register.sh
python manage.py Shell < register.py
9
citynorman

J'ai trouvé la solution. Je devais ajouter le backend à la fonction.

def activate(request, uidb64, token, backend='Django.contrib.auth.backends.ModelBackend'):
    try:
        uid = force_text(urlsafe_base64_decode(uidb64))
        user = User.objects.get(pk=uid)
    except (TypeError, ValueError, OverflowError, User.DoesNotExist):
        user = None

    if user is not None and account_activation_token.check_token(user, token):
        user.is_active = True
        user.profile.email_confirmed = True
        user.save()
        login(request, user, backend='Django.contrib.auth.backends.ModelBackend')
        return redirect('home')
    else:
        return render(request, 'account_activation_invalid.html')
5
gaby awad