【问题标题】:How do I use Django channels to open a Websocket for Django Rest Api?如何使用 Django 通道为 Django Rest Api 打开 Websocket?
【发布时间】: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,

})```

【问题讨论】:

    标签: django dynamic websocket django-channels


    【解决方案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),
            "classrooms": ClassroomConsumer,
            # ....
        }
    
    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 好得多。
    猜你喜欢
    • 2017-06-08
    • 2019-05-31
    • 2017-01-25
    • 2017-07-10
    • 2020-11-30
    • 2019-04-27
    • 2019-05-28
    • 1970-01-01
    • 2021-03-07
    相关资源
    最近更新 更多