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,
})```
我建议使用 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
类。
免责声明 我是上述包的维护者。