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")
最小消息级别
自定义请求中最小消息级别
- 请求中可通过
get_level()
方法获取当前最小消息级别
from django.contrib import messages
def myview(request):
min_message_level = messages.get_level(request)
- 请求中可通过
set_level(request, level)
方法设置最小消息记录级别
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
上下文处理器构成
- 项目注册消息框架
django.contrib.messages
在项目配置文件settings.py
的INSTALLED_APPS
选项中配置django.contrib.messages
以启用消息框架
$ vim settings.py
# 注册应用
INSTALLED_APPS = [
'django.contrib.messages',
]
- 项目添加消息处理中间件类
django.contrib.messages.middleware.MessageMiddleware
消息处理中间件MessageMiddleware
的后端存储依赖于会话框架,因此在中间件中应该提前加载会话处理中间件SessionMiddleware
。
$ vim settings.py
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
]
- 模板中添加消息上下文处理器
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
模块提供了success
、error
、info
、warning
等快捷方法来处理
快捷方法
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
默认情况下如果包含消息的迭代器完成迭代后,当前请求中的消息会被删除。如果需要保留消息则需显式的指定storage
的used
参数为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_tags 和tags 组合成成,组合以空格分隔。 |
extra_tags | 消息定制标签,字符串,默认为空。 |
level_tags | 当前消息级别对应的字符串 |
在模板中显示提示消息
通过if
条件判断是否具有messages
消息,messages
是一个列表,比如使用for
标签来循环。即使只有一条消息也需要迭代messages
列表,否则在下一个请求中,上一个请求的消息不会被清除。可通过迭代出的message
的tags
属性获取每个消息的标签以设置CSS的样式。
{% if messages %}
<script>
{% for msg in messages %}
alert('{{ msg.message }}');
{% endfor %}
</script>
{% endif %}
-
DEFAULT_MESSAGE_LEVELS
获取其映射消息级别的名称 -
message.level
获取当前消息的级别数值 -
message.tags
获取消息的标签名称作为消息样式设置的根据
{% 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 %}
网友评论