2009-12-31 48 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) 

其他存儲可能只是將消息存儲在內存中,所以你真的沒有它。