Résolue

AttributeError: 'AnonymousUser' object has no attribute '_meta'

# Résolution d'erreurs # Bases de données # Django

Salut à nouveau, petit problème quand je tente d'inscrire un shopper depuis la vue signup:

  • j'ai tout modifié de façon à remplacer "username" par "email"

  • le shopper est créé en BDD mais le programme plante au moment de login(request, user) => en supprimant cette instruction il n'y a plus d'erreur!

  • Le message est celui indiqué dans le titre de ma question
    Qu'est ce qui peut provoquer cette erreur? Je précise que via le shell ou la commande superuser tout fonctionne.
    Merci!!
    Ali

le traceback:

Internal Server Error: /signup/
Traceback (most recent call last):
  File "C:\Users\mahfoual\OPC_DRF\e-commerce_docstring\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
    response = get_response(request)
  File "C:\Users\mahfoual\OPC_DRF\e-commerce_docstring\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\mahfoual\formation_doctsring\e-commerce_docstring\accounts\views.py", line 33, in signup
    login(request, user)
  File "C:\Users\mahfoual\OPC_DRF\e-commerce_docstring\lib\site-packages\django\contrib\auth\__init__.py", line 138, in login
    request.session[SESSION_KEY] = user._meta.pk.value_to_string(user)
  File "C:\Users\mahfoual\OPC_DRF\e-commerce_docstring\lib\site-packages\django\utils\functional.py", line 268, in inner
    return func(_wrapped, *args)
AttributeError: 'AnonymousUser' object has no attribute '_meta'
[28/Apr/2024 21:01:10] "POST /signup/ HTTP/1.1" 500 75572

Kévin Silliau

Mentor

Salut Ali !

Pourrais-tu me fournir ton code de ton "views.py" ? Cela m'aiderais à comprendre d'où vient potentiellement le soucis.
Merci d'avance!

salut Kévin, le voici :

from django.contrib.auth import get_user_model, login, logout, authenticate

from django.contrib.auth.forms import get_user_model
from django.shortcuts import render, redirect
from django.views.generic import TemplateView

User = get_user_model()  # on récupère le modèle utilisateur 


# Vue d'inscription basée sur les classes
# class SignUpView(TemplateView):
#     template_name = 'accounts/signup.html'
# 
#     def post(self, request, *args, **kwargs):
#         # on récupère username et password
#         email = request.POST.get('email')
#         password = request.POST.get('password')
#         # on crée l'utilisateur à partir du manager 'objects' de la classe User
#         user = User.objects.create_user(email=email, password=password)
#         # on connecte l'utilisateur nouvellement crée
#         login(request, user)
#         return redirect('index')


def signup(request):
    if request.method == 'POST':  # si la requête est de type POST
        # on récupère email et password
        email = request.POST.get('email')
        password = request.POST.get('password')
        # on crée l'utilisateur à partir du manager 'objects' de la classe User (Shopper)
        user = User.objects.create_user(email=email, password=password)
        # on connecte l'utilisateur nouvellement crée
        # login(request, user)

    return render(request, 'accounts/signup.html')


def login_user(request):

    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')

        user = authenticate(username=username, password=password)
        if user:
            login(request, user)
            return redirect('index')
    return render(request, 'accounts/login.html')


def logout_user(request):
    print(f" {request.user.username} est connecté? {request.user.is_authenticated}")
    logout(request)
    return redirect('index')

Kévin Silliau

Mentor

Je pense qu'ici le problème vient tout simplement du fait qu'AnonymousUser (un utilisateur anonyme donc) n'est pas un utilisateur "valide". Il ne correspond à aucun utilisateur présent dans ta base de données.
Sans trop vouloir m'avancer, je dirais que la fonction authenticate qui regarde si ton utilisateur est un utilisateur valide ne reconnaît pas l'utilisateur et pars donc du principe que c'est un utilisateur anonyme, ce qui pose un problème quand tu essayes de te connecter via la fonction login, car l'utilisateur n'existe techniquement pas et n'as pas de propriété, tu ne peux donc pas l'utiliser pour te connecter ou afficher ses informations par exemple.

Alors peut-être cela vient du fait que tu as changé le "username" par un "email" pour enregistrer un utilisateur et que derrière tu réutilises un username dans ta fonction de login pour te connecter ? Essayes de passer les deux en email ou en username, suivant ton choix, mais que derrière tout soit basé sur ton choix et pas uniquement certains éléments.

Si tu choisis d'utiliser un email plutôt qu'un username à un endroit, pense à vérifier que c'est bien un email qui est utilisé partout désormais (y compris dans ta base de données) !

Merci Kevin. Le problème semble venir de la vue signup avec la fonction importée 'login' qui ne prend en paramètres que 'request' et 'user'.
Le changement d'identifiant n'est pas un choix perso mais fait partie de ce cours, qui à la fin ne montre l'inscription basée sur l'email que via le shell ou 'createsuperuser', pas via la vue signup!
'authenticate' est utilisée dans la vue 'login_user' que je n'utilise pas dans cet exemple.
Merci pour ton aide.

Kévin Silliau

Mentor

Aucun soucis, n'hésites pas à réouvrir une question en cas de besoin!

Bonjour Kevin, à vrai dire ma question n'est pas résolue et reste posée:
Thibault nous explique dans la vidéo comment changer de modèle d'utilisateur et d'adapter le manager, et cela crée un bug au niveau de la vue signup qu'on a définie dans ce cours (avec la fonction importée 'login'). Comment résoudre ce problème avec la vue 'signup'??
Je comprends bien que si dès le départ on opte pour une identification à base de l'email cela pourrait éviter ces erreurs, mais j'aimerais savoir comment dans ce cours on peut passer outre puisque ce n'est pas abordé. Faut-il modifier login(request, user) ? Autre chose?
Merci.
Ali

Thibault houdon

Mentor

Salut !

Est-ce que tu peux mettre le code de ton modèle Utilisateur ? Il semble effectivement y avoir un problème lors de la création de l'utilisateur dans ta méthode create_user, il faut vérifier avant d'utiliser login à quoi correspond l'utilisateur que tu récupères dans la variable user, c'est peut-être tout simplement un return que tu as oublié dans ta méthode.

Thibault au top!! effectivement il me manquait le return user tout simplement comme tu l'as pressenti.
Merci à toi pour ta réponse. je clôture.
Ali

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.