Django——messages消息框架
在网页应用中,我们经常需要在处理完表单或其它类型的用户输入后,显示一个通知信息给用户。对于这个需求,Django提供了基于Cookie或者会话的消息框架messages,无论是匿名用户还是认证的用户。这个消息框架允许你临时将消息存储在请求中,并在接下来的请求(通常就是下一个请求)中提取它们并显示。每个消息都带有一个特定的level标签,表示其优先级(例如info、 warning或error)。
1、启用messages
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'。
2、配置消息引擎(通常默认就好)
(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',
}
3、使用messages
(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')
4、消息过期机制
默认情况下,如果包含消息的迭代器完成迭代后,当前请求中的消息都将被删除。
如果你不想这么做,想保留这些消息,那么需要显式的指定used参数为False,如下所示:
storage = messages.get_messages(request)
for message in storage:
do_something_with(message)
storage.used = False
Django——messages消息框架的更多相关文章
- django 消息框架 message
在网页应用中,我们经常需要在处理完表单或其它类型的用户输入后,显示一个通知信息给用户. 对于这个需求,Django提供了基于Cookie或者会话的消息框架messages,无论是匿名用户还是认证的用户 ...
- 第六章:Django 综合篇 - 10:消息框架 message
在网页应用中,我们经常需要在处理完表单或其它类型的用户输入后,显示一个通知信息给用户. 对于这个需求,Django提供了基于Cookie或者会话的消息框架messages,无论是匿名用户还是认证的用户 ...
- Django messages框架
一.简介 在网页应用中,你经常需要在处理完表单或其它类型的用户输入后,显示一个通知消息(也叫做“flash message”)给用户 对于这个功能,Django 提供基于Cookie 和会话的消息,无 ...
- 整合Django的信息显示框架messages framework
##主要用在view.login函数,不管登录是否成功,都会设置message变量,然后在login.html显示 from django.contrib import messages#需要导的包 ...
- Web框架本质及第一个Django实例 Web框架
Web框架本质及第一个Django实例 Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web ...
- Django 前端Wbe框架
Web框架本质及第一个Django实例 Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web ...
- Django REST framework框架介绍和基本使用
Django REST framework介绍 Django REST framework是基于Django实现的一个RESTful风格API框架,能够帮助我们快速开发RESTful风格的API. 官 ...
- Django的RestfulAPI框架RestFramework
Django的Restful-API框架 安装框架 #sudo pip3 install django #sudo pip3 install markdown #sudo pip3 install d ...
- [编织消息框架][netty源码分析]2 eventLoop
eventLoop从命名上看是专门处理事件 事件系统主要由线程池同队列技术组成,有以下几个优点 1.任务出队有序执行,不会出现错乱,当然前提执行线程池只有一个 2.解偶系统复杂度,这是个经典的生产者/ ...
- Django Rest framework 框架之认证使用和源码执行流程
用这个框架需要先安装: pip3 install djangorestframework 如果写了一个CBV的东西,继承了View. # 继承Django里面View class APIView(Vi ...
随机推荐
- 如何保存/同步多架构容器 Docker 镜像
前言 随着容器.芯片技术的进一步发展,以及绿色.节能.信创等方面的要求,多 CPU 架构的场景越来越常见.典型的应用场景包括: 信创:x86 服务器 + 鲲鹏 ARM 等信创服务器: 个人电脑:苹果 ...
- vue3探索——组件通信之v-model父子组件数据同步
背景 再很多场景中,我们可能想在子组件中修改父组件的数据,但事实上,vue不推荐我们这么做,因为数据的修改不容易溯源. Vue2写法 在vue2中,我们使用.sync修饰符+自定义事件'update: ...
- JS isPrototypeOf 和hasOwnProperty 还有in的区别
isPrototypeOf 和hasOwnProperty 的区别 isPrototypeOf 是判断原生链上是否有该对象. 1.isPrototypeOf isPrototypeOf是用来判断指定对 ...
- 嘉楠k210 多线程 点亮流水灯
from Maix import GPIO from fpioa_manager import fm import _thread import time fm.register(24, fm.fpi ...
- python性能测试,请求QPS测试
QPS = (1000ms/平均响应时间ms)*服务并行数量 #!/user/bin/env python #coding=utf-8 import requests import datetime ...
- c#采用toml做配置文件的坑过
这几天在玩个程序,突然看到c#采用图toml文件,好用,直观,确实也简单. 不过...... github上示例写的 TOML to TomlTable TOML input file:v Enabl ...
- 动态尺寸模型优化实践之Shape Constraint IR Part I
简介: 在本系列分享中我们将介绍BladeDISC在动态shape语义下做性能优化的一些实践和思考.本次分享的是我们最近开展的有关shape constraint IR的工作,Part I 中我们将介 ...
- Pandas+ SLS SQL:融合灵活性和高性能的数据透视
简介: Pandas是一个十分强大的python数据分析工具,也是各种数据建模的标准工具.Pandas擅长处理数字型数据和时间序列数据.Pandas的第一大优势在于,封装了一些复杂的代码实现过程,只需 ...
- 好云推荐官丨飞天加速之星怎样选择云服务器ECS?
编者按:本文来自"好云推荐官"活动的技术博主投稿,作者(昵称天狼)曾入选首届"飞天加速之星",获得飞天人气奖. 你是否还在苦苦地寻找一家合适的云厂商,寻找合 ...
- [Mobi] MacOS 安装设置 ADB (Android Dedug Bridge)
adb (Android Dedug Bridge) 是 Google 提供的一个工具,用于调试 Android 应用程序和系统的各个部分. 在 MacOS 平台,调试安卓应用 首先需要安装 Andr ...