Ошибка 500 при отправке сообщения группе в каналах django

У меня есть следующий Django channels consumer, но когда я пытаюсь отправить данные в группу запасов، он возвращает ошибку 500.

Также, я не получаю никаких журналов ошибок.

Вот потребитель:

class AuthRequiredConsumer(JsonWebsocketConsumer):

    def connect(self):
        user = self.scope['user']
        print(isinstance(user, AnonymousUser))
        if isinstance(user, AnonymousUser):
            raise DenyConnection("authentication required")
        self.accept()


class ChatConsumer(AuthRequiredConsumer):
    groups = ['stocks']
    channel_layer_alias = "stocks"

    def stocks_data(self, event):
        print(event)
        return self.send_json({'message': event['text']})

    def receive_json(self, content, **kwargs):
        channel_layer = get_channel_layer()
        async_to_sync(channel_layer.group_send)(
            "stocks",
            {
                "type": "stocks.data",
                "text": "Hello there!",
            },
        )

        message = content["message"]

        self.send_json({"message": message})

Также, я использую эту середину для аутентификации пользователей по токену:

@database_sync_to_async
def get_user(token_key):
    try:
        token = Token.objects.get(key=token_key)
        return token. user
    except Token.DoesNotExist:
        return AnonymousUser()


class TokenAuthMiddleware(BaseMiddleware):
    def __init__(self, inner):
        super().__init__(inner)

    async def __call__(self, scope, receive, send):
        try:
            token_key = (dict((x.split('=') for x in scope['query_string'].decode().split("&")))).get('token', None)
        except ValueError:
            print("error")
            token_key = None
        scope['user'] = AnonymousUser() if token_key is None else await get_user(token_key)
        return await super().__call__(scope, receive, send)


TokenAuthMiddlewareStack = lambda inner: TokenAuthMiddleware(AuthMiddlewareStack(inner))

А вот конфигурация маршрутизации:

application = ProtocolTypeRouter(
    {
        "http": django_asgi_app,
        "websocket": TokenAuthMiddlewareStack(
            URLRouter(
                [
                    re_path(r"ws/chat/(?P<room_name>\w+)/$", consumers.ChatConsumer.as_asgi())
                ]
            )
        )
        ,
    }
)

Я отлаживал метод receive_json, используя точки останова, и увидел self.channel_name и self.channel_layer - None!!!

У кого-нибудь есть идеи, что происходит с этим потребителем?

Возможно, вы забыли установить свойство CHANNEL_LAYERS в файле настроек.

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [("127.0.0.1", 6379)],
        },
    },
}
Вернуться на верх