Django channels, отклоненный запрос от клиента при добавлении нового заголовка к запросу

Мне нужно добавить новый заголовок к запросу websocket, но он отклоняется и отключается еще до выполнения метода connect в классе WebSocketConsumer :

class RecordConsumer(WebsocketConsumer):
    def connect(self):
        user = self.scope["user"]
        print(user.is_authenticated)
        header_name, header_value = self.scope["headers"][-1]
        print(header_name, header_value)
        print(header_name.decode("utf-8") ==
              "issurvey" and header_value.decode("utf-8") == "true")
        if user.is_authenticated:
            self.room_group_name = "test"
            async_to_sync(self.channel_layer.group_add)(
                self.room_group_name,
                self.channel_name
            )
            self.accept()
        elif header_name.decode() == "issurvey" and header_value.decode() == "true":
            self.room_group_name = "test"
            async_to_sync(self.channel_layer.group_add)(
                self.room_group_name,
                self.channel_name
            )
            self.accept()
        else:
            self.close()

У меня есть пользовательское промежуточное ПО для аутентификации с помощью токена, чтобы иметь возможность подключаться с мобильного устройства :

from channels.auth import AuthMiddlewareStack
from channels.db import database_sync_to_async
from django.contrib.auth.models import AnonymousUser

from rest_framework.authtoken.models import Token
from urllib.parse import parse_qs


@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()
    except KeyError:
        return AnonymousUser()


class TokenAuthMiddleware:
    def __init__(self, inner):
        self.inner = inner

    def __call__(self, scope):
        return TokenAuthMiddlewareInstance(scope, self)


class TokenAuthMiddlewareInstance:
    """
    Yeah, this is black magic:
    https://github.com/django/channels/issues/1399
    """

    def __init__(self, scope, middleware):
        self.middleware = middleware
        self.scope = dict(scope)
        self.inner = self.middleware.inner

    async def __call__(self, receive, send):
        decoded_qs = parse_qs(self.scope["query_string"])
        if b'token' in decoded_qs:
            token = decoded_qs.get(b'token').pop().decode()
            self.scope['user'] = await get_user(token)
        return await self.inner(self.scope, receive, send)


def TokenAuthMiddlewareStack(inner): return TokenAuthMiddleware(
    AuthMiddlewareStack(inner))

Я добавил это промежуточное ПО в файл asgi :

"""
ASGI config for detector project.

It exposes the ASGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/3.2/howto/deployment/asgi/
"""

import os

from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from records.token_auth import TokenAuthMiddleware
import records.routing

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

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket":
    TokenAuthMiddleware(
        AuthMiddlewareStack(
            URLRouter(
                records.routing.websocket_urlpatterns
            ))
        )
})

Вот фотография сервера the request is rejected even before executing the code in connect method

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