首页 > 解决方案 > 如何通过 Django 通道 WebSocket 传递请求并调用 Django 视图

问题描述

我正在使用 Django 开发单页应用程序,并且想使用 WebSockets,因此也想使用 Channels。为了简单起见,我想我想单独通过 WebSocket 处理所有服务器通信,而不是将 XHR(XML HTTP 请求)添加到混合中。我从一开始就使用通道,因为会有很多数据从服务器异步推送到客户端。

使用常规 Django,对https://example.com/loginhttps://example.com/logout或其他任何内容的常规请求和 Django URL 路由器将决定将其发送到哪个视图。相反,我想让用户在客户端执行他们的操作,用 Javascript 处理它,然后使用 WebSocket 将请求发送到服务器。由于我使用的是 Django-allauth,我想使用提供的 Django 视图来处理身份验证等事情。然后,服务器将使用视图中的必要状态信息更新客户端。

我的问题:如何处理通过 WebSocket 接收的数据并将 HTTP 请求提交到 Django 视图?然后,我的频道消费者将获取呈现的 HTML 并将其发送回客户端以更新页面或部分。

我可以想象使用 XHR 会发生什么,但我试图避免将两者混为一谈,除非有人能指出使用 XHR 和 WebSockets 的用处......?我想另一种选择是使用 XHR 进行身份验证和其他客户端发起的请求,并使用 WebSocket 异步更新客户端。这有任何意义吗?

更新:我突然想到我可以requests从 PyPi 使用,并sync_to_async使用我通过 WebSocket 收到的凭据调用 localhost。但是,这需要我处理会话数据并将其发送回客户端。这似乎还有很多工作。也就是说,我可以在服务器上维护会话本身,并将它们与 WebSocket 连接本身相关联。由于我使用的是安全的 WebSocket wss://,是否有可能劫持 WebSocket 连接?

标签: pythondjangowebsocketdjango-channels

解决方案


查看这个项目,它提供了使用 Django Rest Framework 视图处理通道 websocket 请求的能力。您可以尝试将其调整为普通的 Django 视图。


推荐阅读