Django - 使用新消息框架将消息留给(离线)用户

时间:2009-12-31 14:59:27

标签: django

因此不推荐message_set支持新消息框架。好的message_set允许我将消息留给离线用户(例如,当我在cron作业中做一些事情时,我可能想要通知某些用户)。现在看一下新框架,似乎只能将消息添加到request对象中。

我是否遗漏了任何内容,或者向user对象添加消息的功能是否已消失,这意味着我必须自己动手?

5 个答案:

答案 0 :(得分:9)

看起来你什么都不缺。将消息添加到user对象的功能将在Django 1.2中弃用,并在1.4中完全删除(来自django身份验证文档here)。并且没有任何新的消息传递存储后端被预先推送用于消息的持久性(例如数据库或文件存储)。

但并非一切都没有丢失。我在新的消息传递存储后端代码中看不到任何内容,它坚持在存储消息时提供有效请求(因此存储来自例如cron作业的消息将起作用)。如果我是你,我会推出自己的后端,在数据库表中存储消息。

编辑:如何实现此

如果您可以将脱机消息存储实现为一个新的消息传递后端,那么可以采用以下方法:

  1. 定义消息模型

    class UserMessage(models.Model):
      user = models.ForeignKey('auth.User')
      message = models.CharField(max_length=200)
      created = models.DateTimeField(auto_now_add=True)
    
  2. 从您的cron作业手动创建UserMessages

    def some_func_in_my_cron_job():
      ...
      UserMessage.create(user=some_user, message="Something happened")
      ...
    
  3. 定义新的消息存储引擎,覆盖其中一个现有引擎,并重新定义_get()

    from django.contrib.messages.storage.session import SessionStorage
    
    class MyStorageEngine(SessionStorage):
      def _get(self, *args, **kwargs):
        if hasattr(self.request, "user") and self.request.user.is_authenticated():
            offline_messages = UserMessage.objects.filter(user=self.request.user)
            # and delete the messages from the database
        else:
            offline_messages = None
    
      other_messages = super(MyStorageEngine, self)._get(*args, **kwargs)
    
      # all_messages = combine offline_messages and other_messages
    
      return all_messages
    
  4. 在设置中启用新的消息引擎:

    MESSAGE_STORAGE = 'myproj.custom_message_storage.MyStorageEngine'
    
  5. 使用这种方法,您不会使用新的消息传递api写入数据库后端,但您可以使用它来读取手动设置的消息。希望这会有所帮助。

答案 1 :(得分:4)

有人已经创建了一个很好的实现,可能基于接受的答案:

https://github.com/dym/django-offline-messages

from offline_messages.utils import create_offline_message, constants

user = User.objects.get(pk=1)
create_offline_message(user, 'Woo, it worked', constants.SUCCESS)

该消息将在下一页加载时显示给用户。

答案 2 :(得分:1)

答案 3 :(得分:1)

如果您的settings.py正在使用messages_extends.storages.FallbackStorage,您可以创建一条持久性消息(在用户点击x之前将无限显示),使用:

import messages_extends
from messages_extends.models import Message
Message.objects.create(user=target_user, level=messages_extends.INFO_PERSISTENT, message='Hey! You will see me until you click X!')

以下是Message模型的定义:

class Message(models.Model):
    user = models.ForeignKey(User, blank=True, null=True)
    message = models.TextField()
    LEVEL_CHOICES = (
        (messages_extends.DEBUG_PERSISTENT, 'PERSISTENT DEBUG'),
        (messages_extends.INFO_PERSISTENT, 'PERSISTENT INFO'),
        (messages_extends.SUCCESS_PERSISTENT, 'PERSISTENT SUCCESS'),
        (messages_extends.WARNING_PERSISTENT, 'PERSISTENT WARNING'),
        (messages_extends.ERROR_PERSISTENT, 'PERSISTENT ERROR'),
        )
    level = models.IntegerField(choices=LEVEL_CHOICES)
    extra_tags = models.CharField(max_length=128)
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    read = models.BooleanField(default=False)
    expires = models.DateTimeField(null=True, blank=True)

其他存储可能只是将消息存储在内存中,所以你真的没有把它留在手中。

答案 4 :(得分:0)

docs声称有4种不同的存储引擎。 FallbackStorage引擎会写入会话。