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

问题描述 投票:0回答:1

https:/github.comprateekamanatempstack。

所以我有一个简单的应用程序,我想在我的react fronted中获取文章,而不需要动态刷新页面。我知道要做到这一点,我必须实现websockets或者sse连接。所以我试着用Django通道来实现,但我不知道如何设置。

我安装了channels,但是到处都是聊天应用的例子,我只是想简单地从我的休息API中用websocket获取文章。你能不能告诉我,我如何在不使用Django通道的情况下路由websocket?AuthMiddlewareStack() ? (因为我觉得这和用户认证有关,我不想处理这个问题,因为这不是一个聊天应用。)

    # 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,

})```
django dynamic websocket django-channels
1个回答
2
投票

我建议使用 https:/github.comhishnashdjangochannelsrestframework。 这个包。https:/lostmoa.comlogDjangoChannelsRestFramework。 是一个在你的websocket上使用这个来暴露休息API的arcile。

但是你也可以使用上面的包来处理你现有的Django视图。

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

我建议,由于你很可能想通过websocket连接加载多个对象类型,所以你可以考虑使用这个包。https:/github.comhishnashchannelsmultiplexer。

这将让你 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}
}

要想对您的 rest api 消费者进行更精细的控制,可以考虑使用 GenericAsyncAPIConsumer 类。


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

© www.soinside.com 2019 - 2024. All rights reserved.