使用Django实现StackOverflow的通知系统

10

我看到了类似StackOverflow通知面板的问题。 它讨论了实现的客户端部分。

我正在寻找关于服务器部分和网络部分的信息(客户端如何实时接收通知)

用户场景可能是这样的:

  1. 用户A发生了某些事情
  2. 服务器在DB中为用户A创建一条消息(以进行持久化):我使用django-activity-stream进行此操作
  3. 服务器将(新的或最后10个)消息发送给用户A的浏览器(当用户A登录或事件发生时)
  4. 浏览器显示该消息(StackOverflow通知面板部分)
  5. 如果用户确认消息(点击SO中的收件箱),则所有未读的消息都将被标记为已读并记录在服务器中

我对以下步骤有疑问。

  • (3)不确定,但可以使用https://github.com/stephenmcd/django-socketio
  • (4)回答中说客户端具有从服务器接收的json数据。
    服务器是否为每个请求向用户发送消息?
    客户端是否检查本地存储(我对Web不熟悉,哪种本地存储最适合此目的?)并请求json数据,如果他们没有在本地存储中找到它们?
  • (5)如何实现这个seenunseen? django-activity-stream没有相关概念。

我来这里问同样的问题 :) 你有什么运气吗? - jeff
1
我正在使用Django Channels,虽然不是为了这个,但我认为它也可以用于这个。 - eugene
2017年至今还没有答案,我现在也在学习如何做,我认为最好的方法是使用通道或Web套接字。 - Roberto Fernandez Diaz
在许多这样的情况下,不是服务器对用户进行ping操作,而是客户端通过API使用AJAX或一些自定义的Javascript代码请求和更新服务器信息。通常只是一个超时请求,没有什么花哨的东西。对于已读/未读状态,您可以通过Javascript添加单击验证,其中当单击时,更新的信息将发送回服务器。 - Gjert
1个回答

5
这可以通过使用django-channels轻松实现,因为您需要使用Websockets进行双向客户端服务器通信。
显示通知是双向通信。服务器通知客户端有新的通知可用。客户端向用户显示此通知,然后当用户与通知交互时,客户端通知服务器通知已被读取,因此下次用户加载页面时,仅显示未读取的通知。
涉及一些步骤:
  1. 您的服务器需要支持websocket通信。django-channel将应用程序转换为ASGI。
  2. 创建一个websocket consumer,可以向websocket发送和接收消息。
  3. 当用户打开应用程序时,客户端会创建一个websocket连接通道到服务器。
  4. 每当需要发送新通知时,服务器将消息发送到通道。
  5. 在接收到消息时,客户端使用JavaScript在网页上呈现通知,例如显示新消息图标、将新消息添加到消息列表等。
现在,第一部分完成了。您的用户已经收到通知。接下来是第二部分。
  1. 用户看到铃铛图标或其他东西,然后点击它,他会看到通知详细信息(这是由JS渲染的,当客户端收到消息时)。
  2. 用户点击通知/铃铛图标。此时,客户端将向服务器发送一个通知,以便服务器可以更新所有已读取的通知。

我创建了一个应用程序,当有新消息要显示时,会更新客户端。Github链接

您还可以参考类似的问题:https://dev59.com/Aek5XIcBkEYKwwoY593M#55656848


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接