使用 django 和 GCM 推送通知

问题描述 投票:0回答:4

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

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

我找到了这些链接:

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

我想要的一个例子是:

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

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

非常感谢!

--- 编辑 ----

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

安装应用程序时,我将设备注册到 GCM。 我还将 Device_id 添加到数据库中的表中(用户字段目前为

null
),并将 Device_id 保存在我的客户端应用程序中。

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

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

null

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

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

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

我该怎么做?

谢谢!

android django push-notification server google-cloud-messaging
4个回答
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 登录和注销信号 来更新用户字段(或清除它)


1
投票

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

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

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

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


1
投票

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

  1. django-instapush
  2. django 推送通知

前者是我自己开发和维护的。可用于分别向 Android 和 IOS 设备发送 GCM 和 APNS 通知,并且还支持 mongoengine(如果您的 django 模型使用的是 mongoengine)。这是文档的链接。


0
投票

你不需要这一切。您可以通过向 Google 发送

GET
请求来向 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",
           "Content-Type":"application/json",
           "Authorization":"key="+GCM API key
          }

requests.post(url="https://fcm.googleapis.com/fcm/send",data=values,headers=headers)
© www.soinside.com 2019 - 2024. All rights reserved.