La fonction _authenticate_with_backend était obsolète dans django auth.autenticate

Contexte

Mise à jour de la version Django de 1.11.1 à 2.2, J'ai commencé à recevoir une erreur d'authentification que j'avais moi-même personnalisée.

authentifier django 1.11.1

def authenticate(request=None, **credentials):
    """
    If the given credentials are valid, return a User object.
    """
    for backend, backend_path in _get_backends(return_tuples=True):
        try:
            user = _authenticate_with_backend(backend, backend_path, request, credentials)
        except PermissionDenied:
            # This backend says to stop in our tracks - this user should not be allowed in at all.
            break
        if user is None:
            continue
        # Annotate the user object with the path of the backend.
        user.backend = backend_path
        return user

    # The credentials supplied are invalid to all backends, fire signal
    user_login_failed.send(sender=__name__, credentials=_clean_credentials(credentials), request=request)



def _authenticate_with_backend(backend, backend_path, request, credentials):
    args = (request,)
    # Does the backend accept a request argument? <---Quel est ce commentaire?
    try:
        inspect.getcallargs(backend.authenticate, request, **credentials)
    except TypeError:
        args = ()
        credentials.pop('request', None)
        # Does the backend accept a request keyword argument?
        try:
            inspect.getcallargs(backend.authenticate, request=request, **credentials)
        except TypeError:
            # Does the backend accept credentials without request?
            try:
                inspect.getcallargs(backend.authenticate, **credentials)
            except TypeError:
                # This backend doesn't accept these credentials as arguments. Try the next one.
                return None
            else:
                warnings.warn(
                    "Update %s.authenticate() to accept a positional "
                    "`request` argument." % backend_path,
                    RemovedInDjango21Warning
                )
        else:
            credentials['request'] = request
            warnings.warn(
                "In %s.authenticate(), move the `request` keyword argument "
                "to the first positional argument." % backend_path,
                RemovedInDjango21Warning
            )
    return backend.authenticate(*args, **credentials)

↓ Authentification personnalisée

from django.contrib.auth.backends import ModelBackend
from .models import UserProfile


class SignedRequestBackend(ModelBackend):
    """Implémentation d'un backend d'authentification directe pour une authentification séparée"""

    def authenticate(self, user=None, user_profile=None, **kwds):
        if user is None:
            return
        if not user.is_authenticated or not user.is_active:
            return
        if municipality_user_profile is None:
            return
        if not isinstance(user_profile, UserProfile):
            return
        if user.id != user_profile.user_id:
            return
        return user

django 2.2 authentifier

def authenticate(request=None, **credentials):
    """
    If the given credentials are valid, return a User object.
    """
    for backend, backend_path in _get_backends(return_tuples=True):
        try:
            inspect.getcallargs(backend.authenticate, request, **credentials)
        except TypeError:
            # This backend doesn't accept these credentials as arguments. Try the next one.
            continue
        try:
            user = backend.authenticate(request, **credentials)
        except PermissionDenied:
            # This backend says to stop in our tracks - this user should not be allowed in at all.
            break
        if user is None:
            continue
        # Annotate the user object with the path of the backend.
        user.backend = backend_path
        return user

    # The credentials supplied are invalid to all backends, fire signal
    user_login_failed.send(sender=__name__, credentials=_clean_credentials(credentials), request=request)

[Conclusion] La fonction _authenticate_with_backend a été supprimée.

J'ai essayé de déboguer inspect.getcallargs

[Cause de l'erreur] ['self', 'user', 'user_profile'] est assigné à args (veuillez entrer ['self', 'request'] ici)

--Ah, il y a eu un commentaire ... # Le backend accepte-t-il un argument de requête? --Définissez request dans l'argument d'authentification que vous avez fait → L'erreur a été résolue.

Recommended Posts

La fonction _authenticate_with_backend était obsolète dans django auth.autenticate
Avertissement de tri dans la fonction pd.concat
Implémentation de la fonction de connexion dans Django
Changer la langue affichée dans Django 1.9
Récupérer la chaîne de requête (chaîne de requête) avec Django
Obtenez l'adresse IP du client avec Django
Django ~ Affichons-le sur le navigateur ~
Prenez la somme logique de List en Python (fonction zip)
Ajout d'une fonction pour enregistrer les décalages souhaités dans la table des décalages Django
Essayez d'accéder à l'API Spotify dans Django.
Récupérer l'appelant d'une fonction en Python
Correction des arguments de la fonction utilisée dans map
Spécifiez l'URL de la vue dans le modèle Django
J'ai essayé d'implémenter la fonction gamma inverse en python
L'histoire de l'affichage des fichiers multimédias dans Django
[Django] css dans le projet ne peut pas être lu
Modèle dans Django
[Django] Essayons de clarifier la partie de Django qui était en quelque sorte à travers le test
Lorsque j'ai vérifié la requête générée par Django, elle a été émise en grand nombre
Dualité en fonction
Formulaire à Django
Notes d'apprentissage pour la fonction migrations dans le framework Django (2)
Affiche l'heure à partir du moment où le programme a été lancé en python
[Django] Perform Truncate Table (supprimer toutes les données de la table)
Définissez DateField du formulaire sur type = date dans Django
Notes d'apprentissage pour la fonction migrations dans le framework Django (3)
[Django Rest Framework] Personnalisez la fonction de filtre à l'aide de Django-Filter
Notes d'apprentissage pour la fonction migrations dans le framework Django (1)
L'histoire de la confusion entre la production japonaise et Django
Que signifie le dernier () dans une fonction en Python?
C'était génial d'éditer le fichier Python dans Raspberry Pi avec la fonction à distance d'Atom
Une histoire à laquelle j'étais accro en spécifiant nil comme argument de fonction dans Go