2009-12-31 124 views
5

因此message_set已被弃用,以支持新消息框架。好老message_set允许我给离线用户留言(例如,当我在cron工作中做一些事情时,我可能想通知某些用户)。现在看一下新的框架,似乎只能将消息添加到request对象。Django - 使用新消息框架将消息留给(离线)用户

我错过了任何东西,或者是向user消息添加消息的功能,这意味着我将不得不推出自己的产品?

回答

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' 
    

使用这种方法,您不会使用新的消息api写入数据库后端,但您可以读取用它手动设置消息。希望这可以帮助。

+0

感谢您的回答。编写消息存储后端应该很容易。但是,将消息绑定到用户并在用户上线时显示该消息很复杂。有什么建议么? – shanyu 2010-01-02 22:17:13

+0

添加了一种可能的方法作为对答案的编辑。 – zlovelady 2010-01-03 02:20:26

+0

非常有帮助。谢谢.. – shanyu 2010-01-03 14:10:29

0

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

+1

是的,它写入会话,属于“请求”。 – shanyu 2009-12-31 18:20:25

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) 

的信息将显示到下一个页面加载的用户。

1

如果你的settings.py使用messages_extends.storages.FallbackStorage,您可以创建一个持久消息(直到用户点击x将显示indefinetely),使用:

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) 

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