如何在 Django 中使用 Pusher?

How to use Pusher with Django?

我正在尝试使用 pusher 和 django 构建一个应用程序。我浏览了几个像 https://github.com/pusher/django-pusherable 这样的链接,但它缺少示例,因此很难理解!有人可以在这里帮忙吗? 还有这里的频道是什么,因此如何创建一个带有提要(activity 流)的跟随系统? 谢谢!

Pusher 允许您轻松实现 publish/subscribe pattern 消息传递(也简称为 pub/sub)。

在此模式中,有多个通道。每个频道就像一个广播电台的频率。发布者将消息放在频道上,任何正在收听该频道的订阅者(听众)都会收到消息。

发布者不知道有多少人在收听特定频道,它只是发送消息。收听他们感兴趣的频道取决于订阅者。

实际上,一个频道通常包含一个事件类型;因此订阅者可以根据事件类型决定如何处理数据。这有时也称为 消息 class.

例如,股票更新可以是一个渠道。每当库存发生变化时,发布者(您的后端脚本)都会向该频道推送消息;收听此频道的所有客户都会收到该消息。

API guide for channels 阅读有关频道的更多信息。

Pusher 负责管理频道并为您提供编写侦听器的工具。

在您的示例中,每个用户都有自己的 activity 流频道。关注者(可以是用户)可以订阅收听他们感兴趣的用户的频道。

您的系统只是发布所有频道的更新。

在代码中,这将像这样工作(来自 pusher docs 的示例)- 从发布者(后端)方面:

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。

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 是书的对象:

{% 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 控制台会自动记录您的更改。


How can I use it if I have 2 classes in my database like say,one for question and one for options, after creating one question it should appear in the feeds of its followers and along with options, Do I have to push the options also? How to do this?

Pusher 不关心您的数据库 class 是什么,或者您的数据库关系是什么。你得自己想办法。

Pusher 的工作仅限于使 "live update" 在浏览器上发生,而无需用户刷新页面。

Plus how to create relationships, i.e when an user follows another how to subscribe to it and show related feeds?

我想你不太明白 Pusher 在这一切中的作用是什么。

Pusher 不关心你的数据库,它不知道你在数据库中的关系,什么对象与什么相关,谁在关注谁。

推送器所做的就是使浏览器上的一个页面自动更新,而无需用户刷新。

"follow" 另一个用户的逻辑应该已经在您的应用程序中创建。也就是说,您必须有一个允许用户关注其他人的视图。一旦他们关注某人,数据库中将有一条记录 created/updated。此操作将触发 Pusher 为该数据库对象发布消息。现在,任何收听该频道的人都会收到该消息,然后可以用它做任何他们想做的事。

这里是events/development的顺序:

  1. 首先,正常创建您的应用程序。它应该具有您期望的所有功能。如果这是一个社交网络,人们应该能够关注其他人并刷新他们的个人资料页面以查看他们的关注者的任何更新。

  2. 系统应该已经"know"什么是更新以及为每个实体存储什么内容。因此,如果您正在创建 "users" 和 "followers",则应该已经存在表单、屏幕、逻辑、数据库表等,以确保正确的用户可以添加、更新内容。

  3. 一旦你把所有这些都正确地准备好并按照你喜欢的方式工作,现在你就可以引入 Pusher;然后您决定要在浏览器中自动更新哪个 "event"。

假设事件是"whenever a user adds new content to the site, all their followers should be notified"。因此,您将执行以下操作:

  1. 转到用户发布新内容时执行的视图。
  2. 如上所述更新该视图,继承自 PusherUpdateMixin
  3. 转到为用户显示的模板,其中显示了他们的所有关注者。在此模板代码中,添加上述标签以包含推送器 javascript api.

  4. 接下来,在同一个模板中,您将拥有列出该用户关注的所有用户的代码,然后在该逻辑代码中,您可以添加一个 div,它将被更新"automatically" 每当该用户发布更新时。