如何在Django中使用Pusher?

7
我正在尝试使用Pusher和Django构建应用程序。我查看了一些链接,例如https://github.com/pusher/django-pusherable,但缺少示例,因此很难理解!有人可以在这里帮忙吗? 还有,在这里的通道是什么,如何使用它们创建关注-跟随系统和动态流?谢谢!

这个包有一篇关于它的博客文章,网址是https://blog.pusher.com/django-pusherable/。 - argaen
我已经经历过那个了! - user5042031
README 中的 MixinsTemplate Tags 部分提供了所需代码的示例。请问您能否提供一些您正在尝试使用这些 mixins 的示例代码以及一些客户端代码的示例? - leggetter
1
@leggetter:很抱歉,我现在无法提供代码。您能告诉我如何在这里实现活动流吗?频道的结构应该是什么样的,是为一个用户的关注者设置一个频道,还是其他的方式? - user5042031
1个回答

14

Pusher允许您轻松实现消息的发布/订阅模式(也称为pub/sub)。

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

发布者不知道有多少人正在收听特定的通道,它只是发送消息。订阅者需要自行决定要收听哪些通道。

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

例如,股票更新可以是一个通道。发布者(您的后端脚本)将在股票变化时向此通道推送消息;任何正在此通道上侦听的客户端都将收到该消息。

有关通道的更多信息,请参见通道API指南

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 是书的对象:
{% 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发布该数据库对象的消息。现在,谁在监听该频道,将接收到该消息,然后可以对其进行任何操作。

以下是事件/开发的顺序:

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

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

  3. 一旦您正确地放置并按照您的喜好工作,现在您引入Pusher;然后您决定要自动更新哪个“事件”在浏览器中。

Suppose the event is "whenever a user adds new content to the site, all their followers should be notified". So you would then do the following:
  1. 进入用户发布新内容时执行的视图。
  2. 按照上述描述更新该视图,继承自PusherUpdateMixin
  3. 进入显示所有关注者的用户模板。在此模板代码中,添加上述标记以包含pusher javascript api。
  4. 接下来,在同一模板中,您将有列出该用户正在关注的所有用户的代码。在该逻辑代码中,您可以添加一个div,该div将在该用户发布更新时“自动”更新。

你能在这种情况下帮忙吗?非常感谢上面的精彩解释 :) 但是评论中的问题会让它更清晰明了。 - cold_coder
非常感谢!我会尝试这个。 - cold_coder
谢谢!我现在就尝试一下。 - user5042031
@BurhanKhalid 感谢您的回复,我创建了我的 Pusher 帐户并获得了凭据,我的 settings.py 中有 PUSHER_APP_ID = "xxx"、PUSHER_KEY = "xxxx"、PUSHER_SECRET = "xxxx",即使如此,我仍然收到 pusherbadrequest,Unknown auth_key 的错误提示。 - Goun2
@BurhanKhalid 我创建了一个包含完整应用程序代码的主题,如果您能看一下,我将不胜感激。http://stackoverflow.com/questions/44052109/pusherbadrequest-unknown-auth-key - Goun2
显示剩余5条评论

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