Pusher 可以让您轻松实现发布/订阅模式 https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern用于消息传递(也简称为 pub/sub)。
在此模式中,有多个通道。每个频道就像广播电台的频率。发布者将消息放在通道上,任何正在侦听该通道的订阅者(侦听器)都将收到该消息。
发布者不知道有多少人正在收听特定频道,它只是发送消息。订阅者可以自行决定收听他们感兴趣的频道。
实际上,一个通道通常包含一个事件类型;因此订阅者可以根据事件类型决定如何处理数据。这有时也称为消息类.
例如,库存更新可以是一个渠道。每当库存发生变化时,发布者(您的后端脚本)就会向该渠道推送消息;任何和所有监听此频道的客户端都会收到该消息。
阅读有关频道的更多信息渠道 API 指南 https://pusher.com/docs/client_api_guide/client_channels.
Pusher 负责管理通道并为您提供编写侦听器的工具。
在您的示例中,每个用户都有自己的活动流通道。关注者(可以是用户)可以订阅收听他们感兴趣的用户的频道。
您的系统只是发布所有频道的更新。
在代码中,这将像这样工作(来自推送文档 https://pusher.com/docs/javascript_quick_start#/lang=python) - 从发布者(后端)端:
from pusher import Pusher
pusher.trigger(u'test-channel', u'my-event', {u'message': u'hello world'})
从消费者(客户端)方面:
var channel = pusher.subscribe('test-channel');
channel.bind('my-event', function(data) {
alert('An event was triggered with message: ' + data.message);
});
一旦清楚了,我们就转向 django。
The django-pusherable
模块只是通过装饰视图来轻松创建通道。
每个被装饰的视图都会自动为视图中正在访问的对象创建一个通道。每个对象都有自己的通道,名为modelclass_pk
,因此,如果您的模型名为 Book,并且您刚刚创建了第一本书,则该通道将被称为Book_1
.
from pusherable.mixins import PusherDetailMixin, PusherUpdateMixin
class BookDetail(PusherDetailMixin, DetailView):
model = Book
class BookUpdate(PusherUpdateMixin, UpdateView):
model = Book
这负责后端(推送消息)。
在前端(客户端、阅读消息),为您提供了一些模板标签。这些标签仅导入必要的 JavaScript 并帮助您订阅正确的事件。
每个模型有两个默认事件:更新和视图。
现在,假设您想知道 id 1 的书何时更新,并自动更新页面,您可以在模板中编写以下内容。obj
是 book 的对象:
{% load pusherable_tags %}
{% pusherable_script %}
{% pusherable_subscribe 'update' obj %}
<script>
function pusherable_notify(event, data) {
console.log(data.user + "has begun to " + event + " " + data.model);
}
</script>
在您的后端,您可以使用特定的书来调用此视图:
def book_update(request):
obj = get_object_or_404(Book, pk=1)
return render(request, 'update.html', {'obj': obj})
现在在新的浏览器选项卡中打开该视图。
在另一个浏览器选项卡中,或在 django shell 中 - 使用 id 1 更新书籍,您会注意到 javascript 控制台将自动记录您的更改。
如果我的数据库中有两个类,比如一个类,我该如何使用它
问题和一个选项,创建一个问题后应该
出现在其关注者的动态中,并附有选项,我有吗
还要推动选项吗?这个怎么做?
Pusher 不关心你的数据库类是什么,或者你的数据库关系是什么。你必须自己弄清楚这一点。
Pusher 的工作仅限于在浏览器上进行“实时更新”,而无需用户刷新页面。
加上如何创建关系,即当用户遵循另一种方式时
订阅它并显示相关提要?
我想你不太明白Pusher在这一切中扮演的角色是什么。
Pusher 不关心您的数据库,也不了解您在数据库中的关系、什么对象与什么相关以及谁在关注谁。
Pusher 所做的一切就是让浏览器上的一页自动更新,而无需用户刷新。
“关注”另一个用户的逻辑应该已经在您的应用程序中创建。也就是说,您必须有一个允许用户关注其他人的视图。一旦他们关注某人,就会在数据库中创建/更新一条记录。此操作将触发 Pusher 发布该数据库对象的消息。现在,任何在该频道上收听的人都会收到该消息,然后可以用它做任何他们想做的事情。
以下是事件/发展的顺序:
首先,像平常一样创建您的应用程序。它应该具有您期望的所有功能。如果这是一个社交网络,人们应该能够关注其他人并刷新他们的个人资料页面以查看他们的关注者的任何更新。
系统应该已经“知道”什么是更新以及为每个实体存储了哪些内容。因此,如果您要创建“用户”和“关注者”,则应该已经有表单、屏幕、逻辑、数据库表等,以确保正确的用户可以添加、更新内容。
一旦你把所有这些都正确地设置好并按照你喜欢的方式工作,now你引入 Pusher;然后您决定要在浏览器中自动更新哪个“事件”。
假设事件是“每当用户向网站添加新内容时,他们的所有关注者都应该收到通知”。因此,您将执行以下操作:
- 转到用户发布新内容时执行的视图。
- 如上所述更新该视图,继承自
PusherUpdateMixin
转到为用户显示的模板,其中显示了所有关注者。在此模板代码中,添加上述标签以包含推送器 javascript api。
接下来,在同一个模板中,您将拥有列出该用户关注的所有用户的代码,然后在该逻辑代码中,您可以添加一个 div,只要该用户发布更新,该 div 就会“自动”更新。