如何使用 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。
免责声明我是上述软件包的维护者。
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。
免责声明我是上述软件包的维护者。