django 消息框架 message使用详解


Posted in Python onJuly 22, 2019

前言

在网页应用中,我们经常需要在处理完表单或其它类型的用户输入后,显示一个通知信息给用户。

对于这个需求,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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的ORM框架SQLAlchemy入门教程
Apr 28 Python
在SAE上部署Python的Django框架的一些问题汇总
May 30 Python
Python中字符串格式化str.format的详细介绍
Feb 17 Python
Python中Threading用法详解
Dec 27 Python
浅谈numpy库的常用基本操作方法
Jan 09 Python
python中in在list和dict中查找效率的对比分析
May 04 Python
Python2 Selenium元素定位的实现(8种)
Feb 25 Python
Python空间数据处理之GDAL读写遥感图像
Aug 01 Python
python Dijkstra算法实现最短路径问题的方法
Sep 19 Python
python 浅谈serial与stm32通信的编码问题
Dec 18 Python
Python Numpy 控制台完全输出ndarray的实现
Feb 19 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
Feb 27 Python
django 邮件发送模块smtp使用详解
Jul 22 #Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
Jul 22 #Python
Pandas透视表(pivot_table)详解
Jul 22 #Python
django认证系统 Authentication使用详解
Jul 22 #Python
django Admin文档生成器使用详解
Jul 22 #Python
django表单的Widgets使用详解
Jul 22 #Python
Python代码使用 Pyftpdlib实现FTP服务器功能
Jul 22 #Python
You might like
Yii框架防止sql注入,xss攻击与csrf攻击的方法
2016/10/18 PHP
实例分析10个PHP常见安全问题
2019/07/09 PHP
解决Laravel无法使用COOKIE和SESSION的问题
2019/10/16 PHP
js 动态添加标签(新增一行,其实很简单,就是几个函数的应用)
2009/03/26 Javascript
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
正则表达式搭配js轻松处理json文本方便而老古
2013/02/17 Javascript
iframe窗口高度自适应的又一个巧妙实现思路
2014/04/04 Javascript
js键盘事件的keyCode
2014/07/29 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
jQuery替换textarea中换行的方法
2015/06/10 Javascript
JavaScript 对象深入学习总结(经典)
2015/09/29 Javascript
深入理解js中this的用法
2016/05/28 Javascript
详解Vue微信授权登录前后端分离较为优雅的解决方案
2018/06/29 Javascript
koa socket即时通讯的示例代码
2018/09/07 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
2020/03/10 Javascript
js实现磁性吸附的示例
2020/10/26 Javascript
react+antd 递归实现树状目录操作
2020/11/02 Javascript
[02:17]TI4西雅图DOTA2前线报道 啸天mik夫妻档解说
2014/07/08 DOTA
[01:20]DOTA2更新全新英雄 天涯墨客现已加入游戏
2018/08/25 DOTA
带你认识Django
2019/01/15 Python
Django 中间键和上下文处理器的使用
2019/03/17 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
Python实现名片管理系统
2020/02/14 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
Python while true实现爬虫定时任务
2020/06/08 Python
html5 利用canvas手写签名并保存的实现方法
2018/07/12 HTML / CSS
英国最大的在线亚洲杂货店:Red Rickshaw
2020/03/22 全球购物
教育实习生的自我评价分享
2013/11/21 职场文书
给交警的表扬信
2014/01/12 职场文书
优秀医生事迹材料
2014/02/12 职场文书
业务员的岗位职责
2014/03/15 职场文书
中华魂放飞梦想演讲稿
2014/08/26 职场文书
井冈山红色之旅感想
2014/10/07 职场文书
个人学习党的群众路线教育实践活动心得体会
2014/11/05 职场文书
圣诞晚会主持词
2015/07/01 职场文书
使用python创建股票的时间序列可视化分析
2022/03/03 Python