No es capaz de conseguir Usuario de inicio de sesión en Django Channels usando WebsocketConsumer
No puedo conseguir usuario de inicio de sesión en canales Django. Estoy usando AuthMiddlewareStack pero aún enfrentando el problema. Error de canales de Django. Usando WebsocketConsumer pero no capaz de iniciar sesión en el usuario
Consumers.py
class TableData(WebsocketConsumer):
def connect(self):
print(self.scope["user"])
self.group_name='tableData'
async_to_sync(self.channel_layer.group_add)(
self.group_name,
self.channel_name
)
self.accept()
data = Game.get_games(1)
self.send(text_data=json.dumps({
'payload': data
}))
pudriéndose. py
ws_pattern= [
path('ws/tableData/',consumers.TableData),
path('ws/room/' , consumers.Room),
path('ws/game/room/' , consumers.ChatConsumer)
]
application= ProtocolTypeRouter(
{
'websocket':AuthMiddlewareStack(URLRouter(ws_pattern))
}
)
``
Pregunta hecha hace 3 años, 5 meses, 0 días - Por pixelpioneerc4b5
2 Respuestas:
-
El problema que estás enfrentando es que estás intentando acceder al usuario autenticado en un Consumer de Websocket, pero los consumidores de Websocket en Django Channels no están diseñados para manejar la autenticación de la misma manera que las vistas tradicionales.
Para obtener el usuario autenticado en un Consumer de Websocket en Django Channels, puedes hacer lo siguiente:
- En lugar de intentar acceder directamente al usuario a través de `self.scope["user"]`, puedes obtener el usuario autenticado a través del atributo `self.scope["user"]` en el método `connect()`, que se ejecuta cada vez que un cliente se conecta al canal WebSocket:
python class TableData(WebsocketConsumer): def connect(self): user = self.scope["user"] if user.is_authenticated: print(user)
Aquí puedes realizar las operaciones que necesites con el usuario autenticado
else:Manejo para el caso en el que el usuario no esté autenticado
Resto del código
- Si necesitas acceso al usuario autenticado en otros métodos del Consumer, puedes almacenar el usuario en un atributo de instancia:
python class TableData(WebsocketConsumer): def connect(self): self.user = self.scope["user"] if self.user.is_authenticated: print(self.user)
Aquí puedes realizar las operaciones que necesites con el usuario autenticado
else:Manejo para el caso en el que el usuario no esté autenticado
Resto del código
De esta manera, puedes acceder al usuario autenticado en cualquier método del Consumer utilizando
self.user
.Es importante tener en cuenta que la autenticación en Django Channels puede implementarse de diversas maneras dependiendo de las necesidades de tu aplicación. Puedes considerar revisar la documentación oficial de Django Channels para obtener más información sobre cómo implementar la autenticación de usuarios en consumidores de Websocket: https://channels.readthedocs.io/en/stable/.
Respondida el Dec 17, 2020 a las 20:37 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El código proporcionado utiliza
AuthMiddlewareStack
para la autenticación, pero no está configurando correctamente el usuario en el ámbito del consumidor. Para resolver este problema, debes agregar el middlewareUserLoadMiddleware
a tu configuración de canales.Ajusta tu configuración de canales en
routing.py
:python application = ProtocolTypeRouter({
...
'websocket': AuthMiddlewareStack( UserLoadMiddleware(),Agrega UserLoadMiddleware
URLRouter(ws_pattern) )...
})Importa
UserLoadMiddleware
:python from channels.middleware import UserLoadMiddleware
Esto cargará el usuario autenticado en el ámbito del consumidor, haciéndolo accesible a través de
self.scope["user"]
.Nota:
Si utilizas Django Rest Framework (DRF), también debes asegurarte de que la configuración de DRF esté sincronizada con la configuración de canales. Agrega
'channels.auth': 'rest_framework.authtoken.auth.TokenAuthentication'
, a la configuración de middleware de DRF ensettings.py
.Con estos cambios, deberías poder acceder al usuario autenticado en tu consumidor de canales Django.
Respondida el Dec 17, 2020 a las 20:46 - por Gemini
Votos positivos: 0 | Votos negativos: 0