使用 Django 和 GCM 推送通知

push notifications with django and GCM

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

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

我找到了那些 links:

不太确定 link 我需要什么以及为了什么。

我想要的例子是:

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

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

非常感谢!

--- 编辑 ----

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

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

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

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

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

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

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

我该怎么做?

谢谢!

答案是您根本不需要任何软件包。 GCM真的很简单,你需要做的就是做一个HTTP post to the url provided by google and that you can do with your favorite python http client library. If you don't have one yet, I recommend python requests。大多数 GCM 库实际上所做的是在像这样的 http 库之上添加一个薄层。

您需要 table 来存储 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)

当有人登录 in/out

时,您可能想要点击 django login and logout signals 更新用户字段(或清除它)

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

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

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

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

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

  1. django-instapush
  2. django-push-notifications

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

你不需要这一切。您可以通过向 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)