Django Channel 3.0-针对不同websocket路由的不同中间件

Django Channel 3.0-针对不同websocket路由的不同中间件,django,authentication,websocket,routes,django-channels,Django,Authentication,Websocket,Routes,Django Channels,我目前正经历一个难题。我正在尝试实现设备间通信/信号系统。我试图通过WebSockets(Django渠道和消费者)解决这个问题,因为实时事件处理对于我的用例很重要 我希望能够将身份验证中间件仅应用于某些WebSocket协议URL(特定使用者),允许其他URL(如注册和通过JWT登录)在不要求身份验证的情况下进行。该文档介绍了根级别的ProtocolTypeRouter,并鼓励开发人员将ASGI应用程序(如URLRouter)包装到身份验证中间件堆栈中。然而,最终的结果是所有“websocke

我目前正经历一个难题。我正在尝试实现设备间通信/信号系统。我试图通过WebSockets(Django渠道和消费者)解决这个问题,因为实时事件处理对于我的用例很重要

我希望能够将身份验证中间件仅应用于某些WebSocket协议URL(特定使用者),允许其他URL(如注册和通过JWT登录)在不要求身份验证的情况下进行。该文档介绍了根级别的ProtocolTypeRouter,并鼓励开发人员将ASGI应用程序(如URLRouter)包装到身份验证中间件堆栈中。然而,最终的结果是所有“websocket”协议请求都被转发到此中间件

我想做的是,根据websocket协议请求的URL,以某种方式分割对它们的处理。理想情况下,为ProtocolTypeRouter提供两个URLrouter,一个用中间件包装,另一个不用。像这样:

设备处理服务/url.py asgi.py 然而,这似乎不起作用。我收到一个错误
AttributeError:“JWTAuthMiddleware”对象没有属性“callback”
作为参考,我是

我还尝试将值传递给
“websocket”
,作为URL路由器的列表,但是,当然,我得到
TypeError:“List”对象不可调用,因为List不是ASGI应用程序

我还尝试将中间件包装到
websocket\u needs\u auth
URLRouter in
urls.py
中,而不是将其包装在
asgi.py
中,但我仍然无法将此直接包装的URLRouter添加到
asgi.py


有什么想法吗?也许有一种完全不同的方法来解决这个问题?

似乎没有我想要的方法来解决这个问题。在进一步检查文档时,我偶然发现了这样一句话:“请注意,如果内部路由器由其他中间件包装,URLRouter嵌套将无法与path()路由正常工作。”
from channels.routing import URLRouter
from django.urls import re_path
from .consumers import IoTRegisterConsumer,\
    IoTLoginConsumer,\
    IoTPollConsumer


websocket_needs_auth = URLRouter([
    re_path(r"^$", IoTPollConsumer.as_asgi())
])

websocket_no_auth = URLRouter([
    re_path(r"^register/$", IoTRegisterConsumer.as_asgi()),
    re_path(r"^login/$", IoTLoginConsumer.as_asgi()),
])
import os

from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application

import device_handling_service.urls
from .middleware import JWTAuthMiddlewareStack

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

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": URLRouter([
        JWTAuthMiddlewareStack(device_handling_service.urls.websocket_needs_auth),
        device_handling_service.urls.websocket_no_auth
    ])
})