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

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

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

我找到了这些链接:

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

我想要的一个例子是:

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

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

非常感谢!

--- 编辑----

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

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

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

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

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

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

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

我该怎么做?

谢谢!

【问题讨论】:

    标签: android django push-notification server google-cloud-messaging


    【解决方案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 支持)。我建议您使用以下任一方法:

    1. django-instapush
    2. 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 的消息将保留在其末尾,并在设备重新联机时传递。当用户注销时,您应该将用户字段设为空,以便设备仅接收通用消息而不是用户特定消息
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      • 2012-11-27
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      • 2013-02-02
      相关资源
      最近更新 更多