因此不推荐message_set
支持新消息框架。好的message_set
允许我将消息留给离线用户(例如,当我在cron作业中做一些事情时,我可能想要通知某些用户)。现在看一下新框架,似乎只能将消息添加到request
对象中。
我是否遗漏了任何内容,或者向user
对象添加消息的功能是否已消失,这意味着我必须自己动手?
答案 0 :(得分:9)
看起来你什么都不缺。将消息添加到user
对象的功能将在Django 1.2中弃用,并在1.4中完全删除(来自django身份验证文档here)。并且没有任何新的消息传递存储后端被预先推送用于消息的持久性(例如数据库或文件存储)。
但并非一切都没有丢失。我在新的消息传递存储后端代码中看不到任何内容,它坚持在存储消息时提供有效请求(因此存储来自例如cron作业的消息将起作用)。如果我是你,我会推出自己的后端,在数据库表中存储消息。
编辑:如何实现此
如果您可以将脱机消息存储实现为一个新的消息传递后端,那么可以采用以下方法:
定义消息模型
class UserMessage(models.Model):
user = models.ForeignKey('auth.User')
message = models.CharField(max_length=200)
created = models.DateTimeField(auto_now_add=True)
从您的cron作业手动创建UserMessages
def some_func_in_my_cron_job():
...
UserMessage.create(user=some_user, message="Something happened")
...
定义新的消息存储引擎,覆盖其中一个现有引擎,并重新定义_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
在设置中启用新的消息引擎:
MESSAGE_STORAGE = 'myproj.custom_message_storage.MyStorageEngine'
使用这种方法,您不会使用新的消息传递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)
django消息框架的messages_extends https://github.com/AliLozano/django-messages-extends/blob/master/README.md
答案 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
引擎会写入会话。