Django Messages

2020-09-25  本文已影响0人  JunChow520

Django提供了基于Cookie和Session的消息框架,无论是匿名还是认证的用户。消息框架允许临时将消息存储在请求中,并在其后的下一个请求中提取并显示。每个消息都会带有一个特定消息级别的标签以表示优先级。

消息存储

消息框架支持使用不同的后端存储来存储临时消息,Django在django.contrib.messages类中提供了三个内建的存储类。

存储类 描述
storage.session.SessionStorage 存储消息于请求的会话中,需提前开启会话框架。
storage.cookie.CookieStorage 存储消息数据到Cookie中,在请求之间传递消息。
storage.fallback.FallbackStorage 优先使用CookieStorage然后SessionStorage

使用Cookie存储消息时,会使用一个安全的哈希进行签名,以防止篡改。如果Cookie中数据大小超过2048字节,将会丢弃旧的消息。

默认采用的是FallbackStorage类即首先使用CookieStorage,如果消息塞不进一个Cookie则会使用SessionStorage中,这样以避免每次都会读写Session,默认情况下它提供的性能是最好的。

设置消息的存储方式

$ vim settings.py
MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'

消息级别

消息框架的消息级别可配置,和Python的日志模块类似。消息的级别可以根据类型进行分组,以在不同视图和模板中过滤或显示。

内建消息级别

django.contrib.message类中支持的内建级别

消息级别是一个整数常量,可定义自己的级别常量。

消息级别 整数常量 描述
DEBUG 10 在生产部署中需忽略或删除的,与开发相关的消息。
INFO 20 用户的信息类消息
SUCCESS 25 操作成功
WARNING 30 警告消息,故障没有发生,但可能即将会发生。
ERROR 40 操作失败或发生其它故障

MESSAGE_LEVEL配置可用来改变记录的最小级别,可在每个请求中修改,小于目标级别的消息将会被忽略。

$ vim settings.py
from django.contrib.messages import constants as message_constants

MESSAGE_LEVEL = message_constants.INFO

自定义消息级别

消息级别只是一个整数常量,可自定义自己的级别常用,在视图中添加消息时使用。自定义消息级别时,应避免覆盖现有的级别。

from django.contrib import messages
CRITICAL = 50

def myview(request):
  messages.add_message(request, CRITICAL, "A serious error occurred")

最小消息级别

自定义请求中最小消息级别

from django.contrib import messages

def myview(request):
  min_message_level = messages.get_level(request)
from django.crontrib import messages

def myview(request):
  messages.set_level(request, message.DEBUG)
  messages.debug(request, "debug message")
def myview(request):
  messages.set_level(request, None)

消息标签

若要修改消息级别的默认标签,可设置MESSAGE_TAGS为想要修改的级别的字典。

消息级别 标签名称
DEBUG debug
INFO info
SUCCESS success
WARNING warning
ERROR error
$ vim settings.py
from django.contrib.messages import constants as messages

MESSAGE_TAGS = {
  messages.INFO: "",
  50: "critical"
}

启用消息

Django消息框架的实现是通过一个中间件类和对应的context processor上下文处理器构成

  1. 项目注册消息框架
django.contrib.messages

在项目配置文件settings.pyINSTALLED_APPS选项中配置django.contrib.messages以启用消息框架

$ vim settings.py
# 注册应用
INSTALLED_APPS = [
    'django.contrib.messages',
]
  1. 项目添加消息处理中间件类
django.contrib.messages.middleware.MessageMiddleware

消息处理中间件MessageMiddleware的后端存储依赖于会话框架,因此在中间件中应该提前加载会话处理中间件SessionMiddleware

$ vim settings.py
MIDDLEWARE = [
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
]
  1. 模板中添加消息上下文处理器
django.contrib.messages.context_processors.messages

在项目配置的TEMPLATES设置中定义context_processors上下文处理器添加django.contrib.messages.context_processors.messages选项

$ vim settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates')
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

新增消息

在视图或模板中新增消息

from django.contrib import messages

messages.add_message(request, level, message, extra_tags="", fail_silently=False)

在视图文件内导入messages类库

from django.contrib import messages

messages模块提供了successerrorinfowarning等快捷方法来处理

快捷方法

messages类中提供快捷方法为标准新增消息携带HTML标签,消息标签用来表示消息的HTML类型。

messages.debug(request, "%s SQL statements were executed" % count)
messages.info(request, "three credits remain in your account")
messages.success(request,  "profile details updated")
messages.warning(request, "your account expires in three days")
messages.error(request, "document deleted")

显示消息

显示消息的方法原型

get_messages(request)[source]

视图中可通过get_messages()方法获取消息

from django.crontrib.messages import get_messages

storage = get_messages(request)
for message in storage:
  do_something

默认情况下如果包含消息的迭代器完成迭代后,当前请求中的消息会被删除。如果需要保留消息则需显式的指定storageused参数为False

from django.crontrib.messages import get_messages

storage = get_messages(request)
for message in storage:
  do_something

storage.used = False

message消息实例属性包括

属性 描述
message 消息实际内容文本
level 消息级别,整数类型。
tags 消息标签,字符串,由消息的extra_tagstags组合成成,组合以空格分隔。
extra_tags 消息定制标签,字符串,默认为空。
level_tags 当前消息级别对应的字符串

在模板中显示提示消息

通过if条件判断是否具有messages消息,messages是一个列表,比如使用for标签来循环。即使只有一条消息也需要迭代messages列表,否则在下一个请求中,上一个请求的消息不会被清除。可通过迭代出的messagetags属性获取每个消息的标签以设置CSS的样式。

{% if messages %}
<script>
    {% for msg in messages %}
        alert('{{ msg.message }}');
    {% endfor %}
</script>
{% endif %}
{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>
        {% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}Important: {% endif %}
        {{ message }}
    </li>
    {% endfor %}
</ul>
{% endif %}
上一篇下一篇

猜你喜欢

热点阅读