使用 django 和 GCM 推送通知

Posted

技术标签:

【中文标题】使用 django 和 GCM 推送通知【英文标题】:push notifications with django and GCM 【发布时间】:2015-11-30 08:30:37 【问题描述】:

我有一个 android 客户端应用程序,我的服务器在 django 中。

我想在服务器中实现推送通知,例如在与特定用户相关的数据发生变化时通知他们。

我找到了这些链接:

https://django-gcm.readthedocs.org/en/latest/quickstart.html https://github.com/bogdal/django-gcm https://github.com/jleclanche/django-push-notifications

不太确定我需要哪个链接以及用于什么。

我想要的一个例子是:

用户向服务器发出请求并更改数据,服务器向另一个用户发送推送通知。

那么我应该安装什么包?也许有任何教程要遵循? 我正在寻找任何可以帮助我的信息。

非常感谢!

--- 编辑----

所以我按照 e4c5 的建议做了,我有一个包含设备 ID 和用户的表。

我在安装应用程序时将设备注册到 GCM。 我还将 Device_id 添加到我的数据库中的表中(用户字段现在为 null)并将 Device_id 也保存在我的客户端应用程序中。

现在,当用户登录时,我会向我的服务器发送一个请求,该服务器将登录用户与设备 ID 结合起来。

当用户注销时 - 用户字段再次为null

问题是 - 如果 UserA 当前已注销(不在我的数据库中)但应该收到通知 - 我的服务器将查看数据库 -> 设备 ID 表并且不会在任何用户字段中找到 userA (因为他目前已退出)。

因此 - 通知将丢失(我的服务器不会将其发送到 GCM)。

最好是当用户再次登录时,他会收到在他退出时发送给他的所有通知。

我该怎么做?

谢谢!

【问题讨论】:

【参考方案1】:

你不需要这一切。您可以通过向 google 发送获取请求来向您的 android 应用发送通知。试试下面的代码。

    notification_params=
    notification_params['event'] = event
    notification_params['message'] = msg
    notification_params['timstamp'] = datetime.datetime.now()

    values = 
                "to": [list of android gcm registration keys],
                "collapse_key": "collapse key" ,
                "data": json.dumps(notification_params)
                 

    headers = 
               "UserAgent":"GCMServer",
               "ContentType":"application/json",
               "Authorization":"key="+GCM API key
              

   requests.post(url="https://android.googleapis.com/gcm/send",data=values,headers=headers)

【讨论】:

以上代码有错误,应该是“Content-Type”而不是“ContentType”【参考方案2】:

即使这已经得到回答。我建议您使用积极开发和支持的软件包。重新发明***是没有意义的。此外,您将获得未来可能需要的其他优势/功能(例如 APNS 支持)。我建议您使用以下任一方法:

    django-instapush django-push-notifications

前者是我自己开发和维护的。可用于将 GCM 和 APNS 通知分别发送到 android 和 ios 设备,如果您用于 django 模型,还支持 mongoengine。这是documentation的链接。

【讨论】:

你的回答现在是矛盾的,因为你的项目没有得到积极的开发 这两个框架目前都是死项目。很久没有发布了。【参考方案3】:

一个新的答案,以反映已编辑问题中的更新信息和要求。

在用户未登录时发送给用户的排队消息正在远离 GCM 领域。这只是在服务器上维护消息副本的问题。

这可以使用 Redis 轻松实现,但也可以通过添加一个新的 django 模型来保存消息。 IE。您现在正在构建存储和转发系统。

一旦登录信号被触发,它应该查看这个新创建的表并触发消息(前提是它们不是陈旧的)

【讨论】:

【参考方案4】:

答案是您根本不需要任何软件包。 GCM 非常简单,您只需在 google 提供的 url 上创建一个 HTTP post 即可,您可以使用您最喜欢的 python http 客户端库来完成。如果你还没有,我推荐python requests。大多数 GCM 库实际上所做的就是在诸如此类的 http 库之上添加一个薄层。

您需要有一个表来存储 GCM 注册 ID。如果要求使用您的应用的人注册一个帐户,您的 Django 模型可能看起来像这样。

class Device(models.Model) :
    ANDROID = 1
    IPHONE = 2
    CHROME = 3
    OTHER = 4

    DEVICE_CHOICES = ( (ANDROID, 'Android'), (IPHONE, 'iPhone') , (CHROME,'Chrome'), (OTHER,'Others'))

    device_id = models.CharField(unique = True, max_length = 1024, default='')
    device_type = models.SmallIntegerField(choices = DEVICE_CHOICES)
    user = models.ForeignKey(User, null = True)

当有人登录/注销时,您可能需要点击 django login and logout signals 来更新用户字段(或清除它)

【讨论】:

感谢您的回答。我真的不知道我应该将请求发送到哪个 url.. 或使用什么标头。有没有 django 的 gcm 教程? 谢谢。但我确实需要一张设备表和用户......不是吗?因为例如 user1 更改了与 user2 相关的数据。在 django 应用程序中,我需要使用 user2 RegId 发布到 google url(这应该在 django 应用程序中可用,这意味着它应该已经在数据库中).. 对吗?如果正确,我需要从 Auth.user 中找到 user2 RegId .. 好的,谢谢。还有一个问题,当我从客户端应用程序注册到 GCM 时,它会将设备与 Id 耦合。然后 - 当我使用这个 RegId 发布到谷歌 url 时,它会向设备发送推送通知。事情是,我的应用程序中有一个登录/注销,所以我猜如果用户注销,通知也会发送到设备。有办法解决吗?再次感谢! 再次感谢!在此示例中,如果在用户注销时向用户发送通知,则通知将丢失,对吗?我的意思是,用户登录时不会排队接收通知,对吧? 通知的发送方式与用户的registration_id有关,与登录状态无关。如果设备处于脱机状态,排队到特定注册 ID 的消息将保留在其末尾,并在设备重新联机时传递。当用户注销时,您应该将用户字段设为空,以便设备仅接收通用消息而不是用户特定消息

以上是关于使用 django 和 GCM 推送通知的主要内容,如果未能解决你的问题,请参考以下文章

使用 Rhodes 和 GCM 推送通知

避免在 Android 中使用通知推送从 GCM 显示自动通知

iOS 推送通知和 GCM

发送少量通知后未从 GCM 收到推送通知

在 GCM 中未收到推送通知

Android 从 GCM 迁移到 oneSignal 推送通知