Django Channels не может установить Websocket-соединение с пользовательским промежуточным ПО

Я изучаю Django Channels и пытаюсь сделать свой собственный промежуточный модуль аутентификации. Я начинаю с кода из официальной документации . Я пытаюсь установить соединение через Postman, но оно не работает. Все работает хорошо, если я удалю промежуточное ПО в моем asgi.py. Вот мой код:

# routing.py
websocket_urlpatterns = [
    re_path('ws/chat/hihi', ChatRoomConsumer.as_asgi()),
]
# asgi.py
application = ProtocolTypeRouter({
    'http': get_asgi_application(),
    'websocket': QueryAuthMiddleware(URLRouter(
        chatroom.routing.websocket_urlpatterns
    ))
})

Мое промежуточное ПО скопировано из официальной документации.

@database_sync_to_async
def get_user(user_id):
    try:
        return User.objects.get(id=user_id)
    except User.DoesNotExist:
        return AnonymousUser()


class QueryAuthMiddleware:
    """
    Custom middleware (insecure) that takes user IDs from the query string.
    """

    def __init__(self, app):
        # Store the ASGI application we were passed
        self.app = app

    async def __call__(self, scope, receive, send):
        # Look up user from query string (you should also do things like
        # checking if it is a valid user ID, or if scope["user"] is already
        # populated).
        scope['user'] = await get_user(int(scope["query_string"]))

        return await self.app(scope, receive, send)

Вот мой простой потребитель


class ChatRoomConsumer(JsonWebsocketConsumer):
    def connect(self):
        print('connect....')
        if self.scope['user'].is_anonymous:
            self.close()
        self.accept()

    def disconnect(self, code):
        print('ahihihihihi')
        raise StopConsumer

    def receive(self, text_data=None, bytes_data=None, **kwargs):
        text_data_json = json.loads(text_data)
        message = text_data_json['message']

        self.send(text_data=json.dumps({
            'message': message
        }))

При этом я не могу установить соединение (ws://127.0.0.1:8000/ws/chat/hihi?1). Вот журнал терминала:

WebSocket HANDSHAKING /ws/chat/hihi [127.0.0.1:57871]
WebSocket DISCONNECT /ws/chat/hihi [127.0.0.1:57871]
connect....
ahihihihihi

Почему-то всегда отключается даже до вызова connect() и disconnect(). Если я удалю пользовательское промежуточное ПО вот так, оно работает:

# asgi.py
application = ProtocolTypeRouter({
    'http': get_asgi_application(),
    # 'websocket': QueryAuthMiddleware(URLRouter(
    'websocket': URLRouter(
        chatroom.routing.websocket_urlpatterns
    ))
})
Вернуться на верх