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

Posted

技术标签:

【中文标题】如何使用 Django 通道为 Django Rest Api 打开 Websocket?【英文标题】:How do I use Django channels to open a Websocket for Django Rest Api? 【发布时间】:2020-05-24 14:16:29 【问题描述】:

https://github.com/prateekamana/tempstack

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

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

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

)```

【问题讨论】:

【参考方案1】:

我建议使用https://github.com/hishnash/djangochannelsrestframework 这个包。 https://lostmoa.com/blog/DjangoChannelsRestFramework/ 是一个arcile,它使用它在你的websocket上暴露一个rest api。

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

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

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

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

class DemultiplexerAsyncJson(AsyncJsonWebsocketDemultiplexer):
    applications = 
        "users": view_as_consumer(UserDjangoView),
        "clas-s-rooms": Clas-s-roomConsumer,
        # ....
    

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

然后你的前端可以通过同一个 websocket 连接发送消息

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


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

要更精细地控制其余 API 使用者,请考虑使用 GenericAsyncAPIConsumer 类。


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

【讨论】:

我真的不想依赖依赖来完成这样一个简单的任务。你能告诉我如何在不依赖依赖项的情况下将 drf 序列化模型视图发送到我的 Consumer 的接收方法中吗?那将不胜感激。 整合所需的位相当复杂,但请查看github.com/hishnash/djangochannelsrestframework/blob/master/… 我有同样的问题陈述,即使用 Rest API 获取更新的通知。你是怎么解决这个问题的?您的回答将不胜感激。 @ChandlerBing 对不起,我没有给你答案,我中途放弃了。现在我在新农场种蓝莓,比 IT 好得多。

以上是关于如何使用 Django 通道为 Django Rest Api 打开 Websocket?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Django 通道 WebSocket 传递请求并调用 Django 视图

在 Angular6 前端使用 Django 通道

使用 Django 通道进行会话身份验证

不同 docker 容器之间的 Django 通道

将数据发送到 Django 通道

django 通道 websocket 在握手期间关闭