Django Channels Custom Middleware не вызывается
С Django 4 и Channels 4
У меня есть промежуточное ПО следующего вида
from channels.middleware import BaseMiddleware
class TokenAuthMiddleware(BaseMiddleware):
async def __call__(self, scope, receive, send):
print('asdf')
headers = dict(scope['headers'])
if b'authorization' in headers:
# Fetch the token here
token = headers[b'authorization'].decode().split(' ')[-1]
scope['token'] = token
return await self.inner(scope, receive, send)
В моем INSTALLED_APPS
у меня есть channels
и daphne
в верхней части. Я также правильно установил ASGI_APPLICATION
в настройках django.
А в моем asgi.py у меня есть:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'api.settings')
application = ProtocolTypeRouter({
'http': get_asgi_application(),
'websocket': TokenAuthMiddleware(AuthMiddlewareStack(
URLRouter([
re_path(r'ws/agent/$', AgentConsumer.as_asgi()),
])
)),
})
AgentConsumer
- потребитель каналов, основанный на AsyncChannelConsumer
Однако когда я подключаюсь к вебсокету (в данном случае это необработанный скрипт на python с использованием модуля websockets
), мне кажется, что промежуточное ПО не запускается. Если я помещаю оператор печати в определение класса, я его вижу. Но если я помещаю его в __call__()
, я никогда не вижу оператора печати.
Добавить, у меня есть AuthMiddlewareStack, но кажется, что он разрешает даже неаутентифицированные сокетные соединения, что означает, что ни одно из этих промежуточных программ не выполняется?
Есть ли причина, по которой кажется, что промежуточное ПО не выполняется?