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