Self.scope['user'] всегда возвращает значение AnonymousUser в websocket

Я исследовал похожие вопросы, но не могу найти ответ, который бы мне подошел.

Я хочу получить имя пользователя или user_id из сессии, когда пользователь подключается к websocket.

Вот что у меня есть в consumers.py:

import json

from channels.consumer import AsyncConsumer из time import sleep импортировать случайный импортировать redis from django.conf import settings from django.contrib.auth.models import User, AnonymousUser из channels.db import database_sync_to_async из asgiref.sync import async_to_sync из rest_framework.authtoken.models import Token from channels.middleware import BaseMiddleware

redis_instance = redis.StrictRedis(host=settings.REDIS_HOST_LAYER, port=settings.REDIS_PORT_LAYER, db=0 )

class PracticeConsumer(AsyncConsumer):
    async def websocket_connect(self, event):
        print('session data', self.scope['user'])
        await self.send({"type": "websocket.accept", })
    ...
    @database_sync_to_async
    def get_user(self, user_id):
        try:
            return User.objects.get(username=user_id).pk
        except User.DoesNotExist:
            return AnonymousUser()

Это мой asgi.py:

""" Конфигурация ASGI для проекта restapi.

Вызывает вызываемую ASGI переменную как переменную уровня модуля с именем application.

Для получения дополнительной информации об этом файле см. https://docs.djangoproject.com/en/4.0/howto/deployment/asgi/

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'signup.settings')

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": AllowedHostsOriginValidator(
            AuthMiddlewareStack(
                URLRouter(websocket_urlpatterns)
            )
    )
})

и функция входа пользователя в систему + токен, отправляемый при входе пользователя в систему:

class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):

    def validate(self, attrs):
        authenticate_kwargs = {
            self.username_field: attrs[self.username_field],
            "password": attrs["password"],
        }
        try:
            authenticate_kwargs["request"] = self.context["request"]
        except KeyError:
            pass
        user = authenticate(**authenticate_kwargs)
        if not user:
            return {
                'user': 'Username or password is incorrect',
            }
        token = RefreshToken.for_user(user)
        # customizing token payload
        token['username'] = user.username
        token['first_name'] = user.first_name
        token['last_name'] = user.last_name
        token['country'] = user.profile.country
        token['city'] = user.profile.city
        token['bio'] = user.profile.bio
        token['photo'] = json.dumps(str(user.profile.profile_pic))

        user_logged_in.send(sender=user.__class__, request=self.context['request'], user=user)

        if not api_settings.USER_AUTHENTICATION_RULE(user):
            raise exceptions.AuthenticationFailed(
                self.error_messages["no_active_account"],
                "no_active_account",
            )

        return {
            'refresh': str(token),
            'access': str(token.access_token),
        }

Когда я вывожу self.scope['user'] после подключения, я получаю AnonymousUser

Вернуться на верх