12
votes

Demande d'accès.Session de Backend.get_user

Tout d'abord: c'est pas le même que Ce . Le ModelBackend n'a pas de demande membre .

Je veux accéder à la session de l'utilisateur actuel sans avoir accès à l'objet de la demande global ou à son identifiant de session.

pourquoi? J'ai écrit mon propre backend d'authentification, extension modelbackend . Dans que j'ai la fonction get_user (auto, user_id) , qui est appelée à chaque demande (ceci est effectué automatiquement par le middleware Django Auth). Malheureusement, get_user n'a pas accès à la demande , mais néanmoins dans mon cas, je veux vérifier avec les données de la session (pourquoi encore? Parce que je n'ai pas de Base de données locale et obtenez toutes les données d'un middleware distant. La session serait une façon confortable de faire une sorte de mise en cache).


0 commentaires

3 Réponses :


4
votes

the distance userbackend (de django.contrib.auth.backends ) utilise middleware spécial, distanceReMermiddleware , pour accéder aux données de demande. Peut-être que vous pourriez le faire de cette façon.


3 commentaires

Désolé, je sais que c'est un vieux fil, mais je regarde le code référencé et je ne vois pas où il accède aux données de la demande pour l'utilisateur que je viens d'authentifier.


@Ronsmith J'ai mis à jour un peu les liens. L'astuce est que tout a été fait par distance extrémidemiddleware.process_request - il est passé une demande objet (middleware.py # l40). Il vérifie la présence de utilisateur distant http en-tête (L50) et si elle transmet que les données à ROUNDUREMEND.AUTHENTICTICLE (L73) et enregistre le résultat dans la demande < / code> (L77). Dans ce cas, seule la valeur de HTTP Header est PASSEB, mais l'idée était que si vous avez besoin d'informations de session dans l'authentification, vous pourriez la cacher de manière préemptive d'un middleware.


Voulez-vous mettre à jour votre réponse avec quelques lignes de code comme exemple? Merci.



6
votes

Vous pouvez utiliser le minuscule threadlocalmiddleware . Il rend l'objet de la demande partout disponible.

MIDDLEWARE_CLASSES = (
    ...
    'django_tools.middlewares.ThreadLocal.ThreadLocalMiddleware',
    ...
)


0 commentaires

0
votes

Vous pouvez également passer un paramètre "demande" à la fonction authentifier code> à tout moment, vous l'appelez:

def authenticate(self, request, **kwargs):
    ....


2 commentaires

La question concerne la fonction get_user, aucune authentification (..)


J'ai toujours trouvé la réponse utile car j'en avais besoin pendant l'authentification.