es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Django Channels. Suscribirse al canal de un cierto usuario y recibir JSON.

En JsonWebsocketConsumer,

Estoy utilizando este código para suscribirme al socket de cierto usuario (que no es el socket actual) para recibir mensajes de un nuevo diálogo:

def receive_json()
    # ...
    async_to_sync(self.channel_layer.group_add)(f'dialog-{dialog_id}', f'user-{dialog.answerer.id}')
    # ...

Sin embargo, no funciona porque no puedo simplemente establecer el nombre del canal de esta manera:

def connect(self):
    self.channel_name = f'user-{self.scope["user"].id}'

¿Hay alguna forma de suscribirme al socket de otro usuario a un grupo, teniendo su ID de usuario?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, puedes suscribir el socket de otro usuario a un grupo usando su user_id. Una manera de lograr esto es creando un middleware de autenticación personalizado que verifique si el usuario que realiza la solicitud tiene permiso para suscribirse al grupo basado en el user_id proporcionado en la solicitud.

    Una vez que el middleware de autenticación verifica los permisos, puedes usar el método async_to_sync para agregar el socket del usuario al grupo de la siguiente manera:

    from channels.db import database_sync_to_async
    
    class CustomJsonWebsocketConsumer(JsonWebsocketConsumer):
        async def receive_json(self, content, **kwargs):
            user_id = content.get('user_id')
    
            # Verificar los permisos para el usuario actual
            tiene_permiso = await self.has_permission(user_id)
    
            if tiene_permiso:
                # Agregar el socket al grupo
                nombre_grupo = f'user-{user_id}'
                await self.channel_layer.group_add(nombre_grupo, self.channel_name)
    
        @database_sync_to_async
        def has_permission(self, user_id):
            # Verificar si el usuario actual tiene permiso para suscribirse al grupo user_id
            return self.scope['user'].id == user_id
    

    De esta manera, puedes suscribir el socket de otro usuario a un grupo mientras también verificas si el usuario que realiza la solicitud tiene los permisos necesarios.

Comments are closed.