如何通过 Django 通道 WebSocket 传递请求并调用 Django 视图
Posted
技术标签:
【中文标题】如何通过 Django 通道 WebSocket 传递请求并调用 Django 视图【英文标题】:How to pass request over Django channels WebSocket and call Django view 【发布时间】:2019-11-28 22:32:20 【问题描述】:我正在使用 Django 开发单页应用程序,并且想使用 WebSockets,因此也想使用 Channels。为了简单起见,我想我想单独通过 WebSocket 处理所有服务器通信,而不是将 XHR(XML HTTP 请求)添加到混合中。我从一开始就使用通道,因为会有很多数据从服务器异步推送到客户端。
使用常规 Django,对https://example.com/login 或https://example.com/logout 或其他任何内容的常规请求,Django URL 路由器将决定将其发送到哪个视图。相反,我想让用户在客户端执行他们的操作,用 javascript 处理它,并使用 WebSocket 将请求发送到服务器。由于我使用的是 Django-allauth,因此我想使用提供的 Django 视图来处理身份验证等事情。然后,服务器将使用视图中的必要状态信息更新客户端。
我的问题:如何处理通过 WebSocket 接收的数据并将 HTTP 请求提交到 Django 视图?然后,我的频道消费者将获取呈现的 html 并将其发送回客户端以更新页面或部分。
我可以想象使用 XHR 会发生什么,但我试图避免将两者混为一谈,除非有人能指出使用 XHR 和 WebSockets 的用处...?我想另一种选择是使用 XHR 进行身份验证和其他客户端发起的请求,并使用 WebSocket 异步更新客户端。这有任何意义吗?
更新:我突然想到我可以使用 PyPi 中的 requests
,并使用通过 WebSocket 收到的凭据对 localhost 进行 sync_to_async
调用。但是,这需要我处理会话数据并将其发送回客户端。这似乎还有很多工作。也就是说,我可以在服务器上维护会话本身,并将它们与 WebSocket 连接本身相关联。由于我使用的是安全的 WebSocket wss://
,是否有可能劫持 WebSocket 连接?
【问题讨论】:
【参考方案1】:查看this project,它提供了使用 Django Rest Framework 视图处理通道 websocket 请求的能力。您可以尝试将其调整为普通的 Django 视图。
【讨论】:
以上是关于如何通过 Django 通道 WebSocket 传递请求并调用 Django 视图的主要内容,如果未能解决你的问题,请参考以下文章
Django - 通过 websocket 在事件上重复发送 API 调用结果(REST 框架 + 通道)
如何使用 Django 通道为 Django Rest Api 打开 Websocket?
Django DRF websocket 通道 2 并使用来自 Simple JWT 的令牌进行授权
websocket启动时的django通道错误消息(Sessions.py)
Django 通道 websocket 连接和断开连接(Nginx + Daphne + Django + Channels)