如何在Django Channels中为不同路径配置不同WebSocket路由与认证
合并不同认证方式的WebSocket Application解决方案
完全可以将两个application合并为一个,核心思路是:为不同路径前缀的WebSocket路由组单独配置对应的认证中间件,再通过顶层URLRouter将这些带中间件的路由集合整合到同一个ProtocolTypeRouter中。
具体实现步骤
保留原有各App的WebSocket路由定义
不用修改api和live_tracker各自的websocket路由文件,比如:api/routing.py里的websocket_urlpatterns(对应需要Token认证的路由)live_tracker/routing.py里的live_websocket_urlpatterns(对应默认认证的路由)
为每个路由组绑定对应认证中间件
在项目根目录的routing.py中,导入所需模块并为每个路由组套上对应的中间件:from channels.routing import ProtocolTypeRouter, URLRouter from channels.auth import AuthMiddlewareStack from django.urls import path # 导入各App的websocket路由 from api.routing import websocket_urlpatterns as api_ws_urls from live_tracker.routing import live_websocket_urlpatterns as tracker_ws_urls # 导入你的自定义Token认证中间件 from api.middleware import TokenAuthMiddleware接着为不同路由组生成带认证的路由实例:
# 给API的WebSocket路由套自定义Token认证中间件 api_auth_ws_router = TokenAuthMiddleware(URLRouter(api_ws_urls)) # 给Live Tracker的路由套默认认证中间件栈 tracker_auth_ws_router = AuthMiddlewareStack(URLRouter(tracker_ws_urls))合并为单一顶层Application
用ProtocolTypeRouter和顶层URLRouter将两个带认证的路由整合:application = ProtocolTypeRouter({ "websocket": URLRouter([ # 匹配/api/前缀的WebSocket请求,使用Token认证 path("api/", api_auth_ws_router), # 匹配/live-tracker/前缀的请求,使用默认认证 path("live-tracker/", tracker_auth_ws_router), ]), # 如需处理HTTP协议,可在此添加对应的路由配置 # "http": django_asgi_app, })
关键注意事项
- 路径前缀配合:各App内部的WebSocket路由不要包含外层的前缀(比如
api的路由里写path("ws/messages/", MessageConsumer.as_asgi()),完整请求路径就是/api/ws/messages/) - 中间件规范:确保自定义的
TokenAuthMiddleware符合Channels中间件要求——能正确接收scope和receive参数,并将处理后的scope传递给内层的路由应用 - 避免重复定义:删除之前分开的多个
application定义,只用这个合并后的顶层application即可
内容的提问来源于stack exchange,提问作者eagele
相关产品推荐
相关产品推荐

