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
))
})