【问题标题】:How to use Pusher with Django?如何在 Django 中使用 Pusher?
【发布时间】:2015-09-27 16:53:56
【问题描述】:

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

【问题讨论】:

  • blog.pusher.com/django-pusherable有一篇关于这个包的博文。
  • 我已经经历过了!
  • 自述文件的MixinsTemplate Tags 部分为您提供了所需代码的示例。您能否提供一些您尝试与这些 mixin 一起使用的示例代码和一些示例客户端代码?
  • @leggetter:我现在无法提供代码。你能告诉我如何在这里实现活动流吗?频道的结构应该是什么,是指一个用户的粉丝一个频道还是什么?

标签: django django-views real-time pusher


【解决方案1】:

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

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

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

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

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

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

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

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

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

在代码中,这将像这样工作(来自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 是 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 控制台会自动记录您的更改。


如果我的数据库中有 2 个类,例如,一个用于 一个问题和一个选项,在创建一个问题后,它应该 出现在其追随者的提要中以及选项中,我有吗 也推动选项?如何做到这一点?

Pusher 不关心你的数据库类是什么,或者你的数据库关系是什么。你必须自己解决这个问题。

Pusher 的工作仅限于在浏览器上进行“实时更新”,而无需用户刷新页面。

加上如何建立关系,即当用户关注另一个用户时 订阅它并显示相关的提要?

我认为你不太了解 Pusher 在这一切中的作用。

Pusher 不关心您的数据库,也不知道您在数据库中的关系、什么对象与什么相关以及谁在关注谁。

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

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

这是事件/发展的顺序:

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

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

  3. 一旦你把所有的东西都准备好并按你喜欢的方式工作,现在你引入 Pusher;然后您决定要在浏览器中自动更新哪个“事件”。

假设事件是“每当用户向网站添加新内容时,应通知其所有关注者”。因此,您将执行以下操作:

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

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

【讨论】:

  • 如果我的数据库中有 2 个类,比如一个用于问题,一个用于选项,我该如何使用它,在创建一个问题后,它应该出现在其关注者的提要中,并与选项一起出现,我是否也必须推动选项?如何做到这一点?
  • 无论你有多少模型,你都会以同样的方式使用它。
  • 在这种情况下你能帮忙吗?感谢上面的精彩解释:)但评论中的问题会让它更清楚。
  • 加上如何创建关系,即当用户关注另一个用户时如何订阅它并显示相关的提要?
  • 非常感谢!我会试试这个。
猜你喜欢
  • 2013-04-13
  • 2012-08-16
  • 2013-12-07
  • 2023-01-15
  • 2012-04-30
  • 2019-03-18
  • 2017-05-26
  • 1970-01-01
  • 2020-03-11
相关资源
最近更新 更多