django 消息框架 message使用详解
作者:NAVYSUMMER 发布时间:2021-06-21 17:22:29
前言
在网页应用中,我们经常需要在处理完表单或其它类型的用户输入后,显示一个通知信息给用户。
对于这个需求,Django提供了基于Cookie或者会话的消息框架messages,无论是匿名用户还是认证的用户。这个消息框架允许你临时将消息存储在请求中,并在接下来的请求(通常就是下一个请求)中提取它们并显示。每个消息都带有一个特定的level标签,表示其优先级(例如info、 warning或error)。
一、启用消息框架
Django的messages消息框架的实现,依赖messages中间件和对应的context processor。
通过django-admin startproject xxx命令创建工程时,已经默认在settings.py中开启了消息框架功能需要的所有的设置:
INSTALLED_APPS中注册的'django.contrib.messages'。
MIDDLEWARE中添加'django.contrib.sessions.middleware.SessionMiddleware'和'django.contrib.messages.middleware.MessageMiddleware'。Django的messages框架默认使用的存储后端为sessions。所以Session中间件必须被启用,并出现在Message中间件之前。
TEMPLATES设置中的DjangoTemplates选项包含的'context_processors'配置项要包含'django.contrib.messages.context_processors.messages'。
二、配置消息引擎
通常我们使用默认的就好,可以跳过这节,但如果真有需要,也可以配置:
1. 存储后端
Django提供了三种内置的消息存储后端:
class storage.session.SessionStorage class storage.cookie.CookieStorage class storage.fallback.FallbackStorage
FallbackStorage是默认的存储后端。如果它不适合你的需要,你可以通过设置MESSAGE_STORAGE选择另外一个存储后端,例如:
MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'
2. 消息级别
消息框架的级别是可配置的,与Python的logging模块类似
Django内置的message级别有下面几种:
级别 | 说明 |
---|---|
DEBUG | 将在生产部署中忽略(或删除)的与开发相关的消息 |
INFO | 普通提示信息 |
SUCCESS | 成功信息 |
WARNING | 警告信息 |
ERROR | 已经发生的错误信息 |
3. 消息样式
通常,我们在前端HTML页面中,希望给不同级别的消息,增加不同的CSS样式,比如警告为黄色,error为红色等等。
Django为我们提供了一个默认的样式对应关系:
级别 | 样式 |
---|---|
DEBUG | debug |
INFO | info |
SUCCESS | success |
WARNING | warning |
ERROR | error |
也就是说SUCCESS级别的消息,在前端会被赋予一个success样式class。
若要修改消息级别的默认样式,设置MESSAGE_TAGS,按如下例子所示:。
from django.contrib.messages import constants as messages
MESSAGE_TAGS = {
messages.INFO: '',
50: 'critical',
}
三、使用消息框架
1. 添加消息
方法原型:add_message(request, level, message, extra_tags='', fail_silently=False)[source]
新增一条消息:
from django.contrib import messages
messages.add_message(request, messages.INFO, 'Hello world.')
提供请求对象request(直接用就行),消息级别、消息内容字符串三个参数即可。
或者使用下面的快捷方式
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.')
2. 显示消息
方法原型:get_messages(request)[source]
在你的模板文件中,像下面这样使用:
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
相关说明:
通过if判断是否有消息;
messages是一个列表,必须用for标签循环它;
即使你知道只有一条消息,也要迭代messages列表,否则下个请求中,上个请求的消息不会被清除。
可以通过message.tags拿到每个消息的CSS样式
有一个DEFAULT_MESSAGE_LEVELS变量,它映射消息级别的名称到它们的数值:
{% 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 %}
说明:
可以通过message.level拿到当前消息的级别数值;
将它与DEFAULT_MESSAGE_LEVELS.ERROR进行对比;
如果一样,就说明当前消息级别为ERROR,需要显示到页面上。
在模板的外面,比如视图中,可以使用get_messages()方法获取消息:
from django.contrib.messages import get_messages
storage = get_messages(request)
for message in storage:
do_something_with_the_message(message)
说明:
get_messages()返回的是存储后端的一个实例。
循环这个实例,可以获得每条消息
对于每一个消息实例,都包含下面的属性,可以在模版或视图中调用:
message: 消息的实际内容文本。不要使用message.message,直接message。
level: 消息级别,一个整数。
tags: 一个字符串,由该消息的所有标签(extra_tags和tags)组合而成,组合时用空格分割开这些标签。
extra_tags: 一个字符串,由该消息的定制标签组合而成,并用空格分割。默认为空。
level_tag: 当前消息级别对应的CSS字符串,前面介绍过。
3. 自定义消息级别
消息级别只是一个整数常量,所以,可以定义自己的级别常量,例如:
CRITICAL = 50
def my_view(request):
messages.add_message(request, CRITICAL, 'A serious error occurred.')
在自定义消息级别时,应小心避免覆盖现有级别。内置级别的值为:
级别 | 对应整数值 |
---|---|
DEBUG | 10 |
INFO | 20 |
SUCCESS | 25 |
WARNING | 30 |
ERROR | 40 |
如果你需要在HTML或CSS中使用自定义级别,则需要通过MESSAGE_TAGS设置提供相应的映射关系。
4. 自定义每个请求的最小记录级别
每个请求都可以通过set_level()方法设置最小记录级别,如下所示:
from django.contrib import messages
# 修改最小级别为DEBUG
messages.set_level(request, messages.DEBUG)
messages.debug(request, 'Test message...')
# 在另外一个视图中修改最小级别为WARNING
messages.set_level(request, messages.WARNING)
messages.success(request, 'Your profile was updated.') # 被忽略,不记录
messages.warning(request, 'Your account is about to expire.') # 记录
# 将最小级别恢复到默认值
messages.set_level(request, None)
set_level()方法接收request为第一参数,消息级别为第二参数。
类似的,当前有效的记录级别可以用get_level()方法获取:
from django.contrib import messages
current_level = messages.get_level(request)
5. 添加额外的消息CSS样式
要添加自定义的消息CSS样式,可以通过extra_tags参数:
messages.add_message(request, messages.INFO, 'Over 9000!', extra_tags='dragonball')
messages.error(request, 'Email box full', extra_tags='email')
四、消息过期机制
默认情况下,如果包含消息的迭代器完成迭代后,当前请求中的消息都将被删除。
如果你不想这么做,想保留这些消息,那么需要显式的指定used参数为False,如下所示:
storage = messages.get_messages(request)
for message in storage:
do_something_with(message)
storage.used = False
来源:https://www.cnblogs.com/navysummer/p/10200279.html
猜你喜欢
- 随着因特网的发展,在网络环境中,数据库应用渐渐向操作简单、功能实用的方向发展。本文介绍如何利用ASP技术实现对数据库进行在线维护的方法,并给
- 最近在学python的过程中无意间发现一个python库:wxpy,其可以实现让微信自动接收、处理消息并进行回复的一系列功能。感觉挺有意思的
- 二维码作为一种信息传递的工具,在当今社会发挥了重要作用。从手机用户登录到手机支付,生活的各个角落都能看到二维码的存在。那你知道二维码是怎么解
- 这几天看了篇叫"Penetration: from application down to OS (Oracle)"的文
- 症状: 访问asp网页的时候出现如下错误:Server object error ''ASP 0178 : 80070005
- 说明1、需要一个函数来处理的参数数是不确定的,这时可以使用多值参数。2、python有两个多值参数,在参数名前增加一个*可以接收元组。在参数
- 2007年1月,国务院 * 了中央“一号文件”,文件中对加快农业信息化建设有了更明确的部署,为新农村建
- 阅读上一篇教程:WEB2.0网页制作标准教程(8)CSS布局入门接下来开始要真正设计布局了。和传统的方法一样,你首先要在脑海里有大致的轮廓构
- 今天编ZBlog上传模块的时候,需要用到一个提取文章中文件名的子程,开始我把问题想复杂了,匹配了所有可能的文件名,不仅正则表达
- PHP session用法其实很简单它可以把用户提交的数据以全局变量形式保存在一个session中并且会生成一个唯一的session_id,
- from keras.utils.np_utils import to_categorical注意:当使用categorical_cross
- 第一次见到《Web标准和SEO应用实践》是在我们UCD书友会《设计沟通十器》新书发布现场,机械工业出版社的朋友还带了很多相关新书过来,当时本
- 写入:1:把gif图像文件读入内存(一个变量strTemp)。2:写入数据库。Dim binTmp() As
- 阅读上一篇:交互设计模式(二)-Pagination(分页,标记页数) Tagging(标签)问题摘要用户往往想通过流行或最详尽的主题来浏览
- [前言]:搭往公司的班车,遇到其他部门的同事,他问了很多关于我的工作的问题,由此引发这篇文章。这些问题,我也经常被其他人问到,其中既有我们亲
- 关于CSS中的命名规则(其实我觉得是XHTML元素的命名规则更加合理些)这个问题,已经有很多人在说了,其中也不乏一些真知灼见。不过这种东西也
- 下面是代码,如果看不懂,建议先把表格的一些<tr><td>的表格原理弄清楚了,就可以了代码如下:<table&
- 前言昨天团队的学妹来问关于POP3协议的问题,所以今天稍稍研究了下POP3协议的格式和Python里面的poplib。而POP服务器往回传的
- 问题一:将u'\u810f\u4e71'转换为'\u810f\u4e71'方法:s_unicode = u&
- 介绍我们可以通过控制HeaderStyle, RowStyle, AlternatingRowStyle和其他一些属性来改变GridView