django - sistema - Acceder request.session desde backend.get_user
request.user django (3)
Primero que nada: esto no es lo mismo que esto . The ModelBackend no tiene un miembro de request
.
Quiero acceder a la sesión del usuario actual sin acceso al objeto de solicitud global o su ID de sesión.
¿Por qué? Escribí mi propio backend de autenticación, extendiendo ModelBackend
. En eso tengo la función get_user (self, user_id)
, que se llama con cada solicitud (esto lo hace automáticamente el middleware auth de Django). Lamentablemente, get_user
no tiene acceso a la request
, sin embargo, en mi caso, deseo verificar los datos de la sesión (¿por qué otra vez?) Porque no tengo una base de datos local y obtengo todos los datos de un middleware remoto. ser una forma cómoda de hacer algún tipo de almacenamiento en caché).
Puedes usar el pequeño ThreadLocalMiddleware . Hace que el objeto de solicitud esté disponible en todas partes.
from django_tools.middlewares import ThreadLocal
request = ThreadLocal.get_current_request()
# request.session <-- is now available
No olvide agregar el middleware en la tupla MIDDLEWARE_CLASSES de su settings.py:
MIDDLEWARE_CLASSES = (
...
''django_tools.middlewares.ThreadLocal.ThreadLocalMiddleware'',
...
)
También puede pasar un parámetro de ''solicitud'' a la función de authenticate
cada vez que lo llame:
def authenticate(self, request, **kwargs):
....
RemoteUserBackend
(de django.contrib.auth.backends
) utiliza un middleware especial, RemoteUserMiddleware
, para acceder a los datos de solicitud. Quizás podrías hacerlo de esta manera también.