如何在 Django 中使用 Pusher?

2024-01-18

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


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 发布该数据库对象的消息。现在,任何在该频道上收听的人都会收到该消息,然后可以用它做任何他们想做的事情。

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

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

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

  3. 一旦你把所有这些都正确地设置好并按照你喜欢的方式工作,now你引入 Pusher;然后您决定要在浏览器中自动更新哪个“事件”。

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Django 中使用 Pusher? 的相关文章

随机推荐

  • PyQt5 制作子类小部件

    所以我想知道如何制作小部件的子类 例如 如果我想创建一个小部件 它继承了 QtWidgets QPushButton 的方法和属性 但是我会在此基础上创建额外的方法和属性 class Coord QtWidgets QPushButton
  • java模块可以调用c模块吗?

    只是出于兴趣 是否可以从 java 模块调用 C 模块 如果是这样 该怎么办 是的 你可以使用Java 本机接口 http java sun com j2se 1 3 docs guide jni 去做这个
  • PL/SQL:是否有完全停止脚本执行的指令?

    我试图在 PL SQL 脚本的开头对数据库模式进行一些检查 如果检查给出不成功的结果 我想停止脚本 以防止执行下一条指令 我有这样的东西 1st line of PL SQL script DECLARE SOME COUNT INTEGE
  • 为什么算术运算符的参数类型默认为 int?

    我是 F 新手 我惊讶地发现f x y x y实际上是int gt int gt int 显然 https stackoverflow com questions 501069 functions with generic paramete
  • Delphi:“TObject 数组”类型参数上的 SetLength()

    我正在尝试调整作为参数传递的某个类的数组的大小 例如 procedure Resize MyArray Array of TObject begin SetLength MyArray 100 end 但是 这会引发错误 E2008 不兼容
  • 如何阻止异步 tcp .NET 代码耗尽整个系统的资源

    在我的一些异步 TCP 服务器代码中 偶尔会发生错误 导致进程消耗整个系统的内存 在查看日志 事件查看器和一些MS docs http support microsoft com kb 947862如果 调用应用程序多次对同一客户端进行异步
  • 设置 TCP/IP 客户端和服务器通过网络进行通信

    我正在尝试学习一些有关套接字编程的知识 并且偶然发现了 TcpListener 和 TcpClient 来使用 因为我读到它们对于初学者来说稍微容易一些 我想要完成的基本要点是拥有一个可以在我的笔记本电脑和同一网络上的另一台笔记本电脑上运行
  • 对 pandas 数据框进行子集化的最佳方法[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 嘿 我是 Pandas 新手 我刚刚遇到df query 为什么人们会使用df query 什么时候可以使用括号表示法直接过滤数据框 panda
  • 如何在 JavaScript 中添加 HTML 标签?

    我想在我的 javascript 中使用一个 html 标签 但不知道如何使用它 For ex p An absolute URL a href https www w3schools com W3Schools a p 这是我的标签 我想
  • 如何使用 C++ 发出 HTTP 请求?

    有没有办法用C 轻松发出HTTP请求 具体来说 我想下载一个页面 API 的内容并检查内容是否包含1或0 是否也可以将内容下载到字符串中 我有同样的问题 libcurl http curl haxx se libcurl 真的很完整 有一个
  • DetectionAPI 仅支持单声道 Wav

    我正在开发一个拍手检测 Android 应用程序 我在用musicg https github com madyx musicgapi 用于此 我从github导入了该项目并在android设备上运行 然后这个错误显示 DetectionA
  • Memcache 错误:无法从流 (0) 数组读取行

    当我们的服务器承受任何重大负载时 我会收到以下错误的一些变化 我已经在谷歌上搜索了几个小时并尝试了一切 包括升级到最新版本和全新安装 我已经阅读了 SA 上所有关于它的帖子 但无法弄清楚 很多人都有同样的问题 但似乎没有人有明确的答案 任何
  • Ga特林 j.n.ConnectException:地址已在使用中

    当使用 Ga特林运行模拟时 我遇到以下异常 j n ConnectException 地址已在使用中 没有更多信息 当测试的服务器无法响应或超时时是否会发生这种情况 我想确保这是服务器抛出的异常 而不是客户端抛出的异常 我在 Windows
  • AWS 负载均衡器连接到同一服务器上的多个端口,无需 PAT

    我有一个 EC2 Web 服务器 它提供一个侦听端口 80 8080 443 和 8443 的应用程序 外部客户端需要在这些端口上与其通信 无端口转换 我试图将其放在负载平衡器后面 但过多的所需端口让我感到困惑 我有一个 ALB 监听 4
  • 当 NFS 挂载失败时,bash 检查目录是否存在挂起

    我有一个 bash profile 脚本 它根据目录存在为我设置一些别名 if d home user games then alias cdgames cd home user games fi 这些目录之一位于 NFS 挂载上 如果文件
  • 如何在 JSON Schema 中制作二维数组?

    下面的二维数组怎么写JSON 架构 http json schema org 网格固定为16 13 它包含完全空的行或具有 int 0 99 或空字符串等值的行 这是数组的示例 94 78 37 78 61 71 42 82 53 62 6
  • PyObjC + Xcode 3.2 + 非 Apple Python

    我想开始尝试使用 PyObjC 开发一些简单的应用程序 我安装了 PyObjC 和 Xcode 模板 我知道 PyObjC 本身可以工作 因为我已经运行了这个脚本 http svn picidae net trunk pici server
  • 从二进制文件中删除 protobuf C++ 编译的路径字符串

    当我编译使用 Protobuf 的 C 程序 然后运行 linux 时strings二进制文件上的命令 其中一个字符串是生成的路径cc文件 包含我的主目录和所有内容 显然 我想从二进制文件中删除我的主目录和其他个人信息 该路径从何而来以及如
  • c 中 qsort() 函数中的 cmpfunc

    有人可以解释一下吗cmpfunc这是用在qsort功能 什么是a and b在这个函数中 它们指向什么 int cmpfunc const void a const void b return int a int b a and b in
  • 如何在 Django 中使用 Pusher?

    我正在尝试使用 Pusher 和 django 构建一个应用程序 我浏览了一些链接 例如https github com pusher django pusherable https github com pusher django pus