如何使用 Django 通道为 Django Rest Api 打开 Websocket?

How do I use Django channels to open a Websocket for Django Rest Api?

https://github.com/prateekamana/tempstack

所以我有一个简单的应用程序,我想在我的 React Fronted 中获取文章,而不必动态刷新页面。我知道我必须实现 websockets 或 sse 连接。所以我尝试使用 Django 通道来实现它,但我不知道如何设置它。

我安装了频道,但到处都是聊天应用程序的例子,我只想简单地从我的休息中获取带有 websocket 的文章 api。你能告诉我如何在没有 AuthMiddlewareStack() 的情况下路由 websockets 吗? (因为我认为这必须与用户身份验证相关,我不想处理它,因为它不是聊天应用程序。)

    # WebSocket chat handler
    "websocket": AuthMiddlewareStack(
        URLRouter([
            url(r"^chat/admin/$", AdminChatConsumer),
            url(r"^chat/$", PublicChatConsumer),
        ])
    ),

    # Using the third-party project frequensgi, which provides an APRS protocol
    "aprs": APRSNewsConsumer,

})```

我建议看看使用 https://github.com/hishnash/djangochannelsrestframework this package. https://lostmoa.com/blog/DjangoChannelsRestFramework/ 是一个 arcile,它使用它在你的 websocket 上公开休息 api。

不过,您也可以使用上述包来处理现有的 Django 视图。

application = ProtocolTypeRouter({
    "websocket": AuthMiddlewareStack(
        URLRouter([
            url(r"^front(end)/$", view_as_consumer(YourDjangoView)),
        ])
    ),
 })

我会建议,因为您可能希望通过您的 websocket 连接加载多个对象类型,所以您会考虑使用它:https://github.com/hishnash/channelsmultiplexer

这将使您 multiplex 通过单个 websocket 连接向多个消费者发送消息。

class DemultiplexerAsyncJson(AsyncJsonWebsocketDemultiplexer):
    applications = {
        "users": view_as_consumer(UserDjangoView),
        "classrooms": ClassroomConsumer,
        # ....
    }

application = ProtocolTypeRouter({
    "websocket": AuthMiddlewareStack(
        URLRouter([
            url(r"^ws/$", DemultiplexerAsyncJson),
        ])
    ),
 })

然后您的前端可以通过相同的 websocket 连接发送消息

例如,要从 UserDjangoView 中获取所有用户,您可以发送。

{
    "stream": "users",
    "payload": {"action": "delete", "pk": 42}
}

为了更精细地控制您的休息 api,消费者可以考虑使用 GenericAsyncAPIConsumer class。


免责声明我是上述软件包的维护者。