Django message组件
使用message组件要在seetings中配置
①INSTALLED_APPS (项目需要什么功能都放在这 既可以有数据库,又可以写代码,html文件,和自己写的APP一个道理)

②MIDDLEWARE 中间件 (请求进来做什么,请求走的时候做什么)

③TEMPLATES (模板,在html页面中操作方便)

④第四个位置可以放在任意地方 有三种配置(将数据保存在cookie中或session中,或者全部保存)

使用方法
设置值
第一个参数request .第二个参数 消息的级别,messages.SUCCESS不一定要这么写.第三个参数,自己写具体的参数. 以列表的形式存在
1 from django.contrib import messages
2 messages.add_message(reqeust, messages.SUCCESS, "删除成功")
3 messages.add_message(reqeust, messages.ERROR, "删除失败")
在视图中读取值(使用python代码) 循环读取到messages, 读取到的同时并删除 (类里面写的__iter__方法所以可以循环)
1 from django.contrib.messages.api import get_messages
2 messages = get_messages(request)
3 for msg in messages:
4 print(msg)
使用html代码读取值
<ul>
{% for message in messages %}
<li>{{ message.tags }} {{ message }}</li>
{% endfor %}
</ul>
源码分析
message是一个对象(包裹),可以包裹很多数据

1 class Message:
2 """
3 Represent an actual message that can be stored in any of the supported
4 storage classes (typically session- or cookie-based) and rendered in a view
5 or template.
6 """
7
8 def __init__(self, level, message, extra_tags=None):
9 self.level = int(level)
10 self.message = message
11 self.extra_tags = extra_tags
12
13 def _prepare(self):
14 """
15 Prepare the message for serialization by forcing the ``message``
16 and ``extra_tags`` to str in case they are lazy translations.
17 """
18 self.message = str(self.message)
19 self.extra_tags = str(self.extra_tags) if self.extra_tags is not None else None
20
21 def __eq__(self, other):
22 if not isinstance(other, Message):
23 return NotImplemented
24 return self.level == other.level and self.message == other.message
25
26 def __str__(self):
27 return str(self.message)
28
29 @property
30 def tags(self):
31 return ' '.join(tag for tag in [self.extra_tags, self.level_tag] if tag)
32
33 @property
34 def level_tag(self):
35 return LEVEL_TAGS.get(self.level, '')
request,level,message分别对应设置值时候的参数,extra_tags='':可以自己写点东西,一般不用写.fail_silently=False,是在if not fail_silently 做的一个异常处理,也就是说如果有异常了安安静静的在那不要报错.
重点: messages = request._messages 在request中读取到了一个对象,return messages.add(level, message, extra_tags) 调用了messages.add,把这个三个参数传过去了.
request_messages是在'django.contrib.messages.middleware.MessageMiddleware' 这个中间件中定义的,看是在第四个位置中哪个存储的对象,SessionStorage对象(第四个位置设置的哪个就是那个对象)
所以messages = request._messages就是声明了一个SessionStorage的对象(第四个位置设置的哪个就是那个对象),SessionStorage源码中实例化了这个对象,下面有调用了messages.add(level, message, extra_tags)方法,SessionStorage这个类中没有message.add方法,在父类BaseStorage中,接收了三个参数def add(self, level, message, extra_tags='').最后封装给了message = Message(level, message, extra_tags=extra_tags), 总而言之绕了一圈,最终传入进来的值都会封装给Message对象
def add_message(request, level, message, extra_tags='', fail_silently=False):
"""
Attempt to add a message to the request using the 'messages' app.
"""
try:
#SessionStorage的对象(第四个位置设置的哪个就是那个对象)
messages = request._messages
"""
except AttributeError:
if not hasattr(request, 'META'):
raise TypeError(
"add_message() argument must be an HttpRequest object, not "
"'%s'." % request.__class__.__name__
)
if not fail_silently:
raise MessageFailure(
'You cannot add messages without installing '
'django.contrib.messages.middleware.MessageMiddleware'
)
"""
else:
return messages.add(level, message, extra_tags)
SessionStorage源码中实例化了这个对象


SessionStorage父类中

Message中
1 class Message:
2 """
3 Represent an actual message that can be stored in any of the supported
4 storage classes (typically session- or cookie-based) and rendered in a view
5 or template.
6 """
7
8 def __init__(self, level, message, extra_tags=None):
9 self.level = int(level)
10 self.message = message
11 self.extra_tags = extra_tags
12
13 def _prepare(self):
14 """
15 Prepare the message for serialization by forcing the ``message``
16 and ``extra_tags`` to str in case they are lazy translations.
17 """
18 self.message = str(self.message)
19 self.extra_tags = str(self.extra_tags) if self.extra_tags is not None else None
20
21 def __eq__(self, other):
22 if not isinstance(other, Message):
23 return NotImplemented
24 return self.level == other.level and self.message == other.message
25
26 def __str__(self):
27 return str(self.message)
28
29 @property
30 def tags(self):
# 自己的tag和通过extra传进来的tag都传进来通过空格拼接
31 return ' '.join(tag for tag in [self.extra_tags, self.level_tag] if tag)
32
33 @property
34 def level_tag(self):
35 return LEVEL_TAGS.get(self.level, '')
level_tag拿到的就是下面这个字典,在seetings中还可以自定义

DEFAULT_TAGS


Django message组件的更多相关文章
- django Form组件
django Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建 ...
- python 全栈开发,Day98(路飞学城背景,django ContentType组件,表结构讲解)
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...
- 9.24 Django Form组件
2018-9-23 20:10:04 这两天优化了自己图书管理系统 github 连接:https://github.com/TrueNewBee/pythonDemo 顺便整理了博客,写了好多总结, ...
- django -----分页器组件
分页器组件 本文目录 1 Django的分页器(paginator)简介 2 应用View层 3 模版层 index.html 4 扩展 回到目录 1 Django的分页器(paginator)简介 ...
- element-ui Message组件源码分析整理笔记(八)
Message组件源码: main.js import Vue from 'vue'; import Main from './main.vue'; import { PopupManager } f ...
- element-ui中单独引入Message组件的问题
import Message from './src/main.js'; export default Message; 由于Message组件并没有install 方法供Vue来操作的,是直接返回的 ...
- Django - Xadmin 组件(一)
Django - Xadmin 组件(一) Web 应用中离不开的就是后台管理, Django 自带的 admin 组件提供了一部分内容,但往往现实项目中会有更多的需求,所以自定义自己的后台管理就十分 ...
- GUI的最终选择 Tkinter(八):Message组件、Spinbox组件、PanedWindow组件、Toplevel组件
Message组件 Message(消息)组件是Label组件的变体,用于显示多行文本消息,Message组件能够自动执行,并调整文本的尺寸使其适应给定的尺寸. from tkinter import ...
- Django forms组件里的ChoiceField、ModelChoiceField和ModelMutipleChoiceField的区别
阅读简要 首先我们要明白Django forms组件里的ChoiceField.ModelChoiceField和ModelMutipleChoiceField是继承关系 ChoiceField 1. ...
- Django—Form组件
Django From简介 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比 ...
随机推荐
- C++冒泡排序简单讲解
此文章我已在洛谷博客发布,不算抄袭 什么是冒泡排序 冒泡排序(Bubble Sort)也是一种简单直观的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访 ...
- LeetCode 周赛 342(2023/04/23)容斥原理、计数排序、滑动窗口、子数组 GCB
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 前天刚举办 2023 年力扣杯个人 SOLO 赛,昨天周赛就出了一场 Easy - Ea ...
- 干货|工作中要使用Git,看这篇文章就够了
本文将从 Git 入门到进阶.由浅入深,从常用命令.分支管理.提交规范.vim 基本操作.进阶命令.冲突预防.冲突处理等多方面展开,足以轻松应对工作中遇到的各种疑难杂症,如果觉得有所帮助,还望看官高抬 ...
- [人脸活体检测] 论文:Aurora Guard- Real-Time Face Anti-Spoofing via Light Reflection
Aurora Guard- Real-Time Face Anti-Spoofing via Light Reflection 论文简介 该论文提出的方法已经部署到百万台终端,整篇文章底气十足.作者设 ...
- golang中一种不常见的switch语句写法
最近翻开源代码的时候看到了一种很有意思的switch用法,分享一下. 注意这里讨论的不是typed switch,也就是case语句后面是类型的那种. 直接看代码: func (s *systemd) ...
- Django笔记三十五之admin后台界面介绍
本文首发于公众号:Hunter后端 原文链接:Django笔记三十五之admin后台界面介绍 这一篇介绍一下 Django 的后台界面使用. Django 自带了一套后台管理界面,可用于我们直接操作数 ...
- spring xml配置中引用java配置不能用ClassPathXmlApplicationContext
现在的目的是想测试在xml配置中引用java配置的bean CD唱片的接口: package v4.c2; public interface CompactDisc { void play(); } ...
- Rsync文件同步及备份
Rsync文件同步及备份 目录 Rsync文件同步及备份 Rsync基本概述 远程文件传输 服务端口 Rsync的三种传输模式 本地方式(类似cp) 远程方式(类似scp) 守护进程(C/S结构) R ...
- 2023-05-05:给定一个无向、连通的树 树中有 n 个标记为 0...n-1 的节点以及 n-1 条边 。 给定整数 n 和数组 edges , edges[i] = [ai, bi]表示树中的
2023-05-05:给定一个无向.连通的树 树中有 n 个标记为 0...n-1 的节点以及 n-1 条边 . 给定整数 n 和数组 edges , edges[i] = [ai, bi]表示树中的 ...
- redis内存突然暴增,排查思路是什么
1 这种暴增的应该还是上次一个群友说的,更多可能是外部因素导致的,应用新上线,定时任务这些,再有就是cat上查是哪些指令多,以及比对和之前的时间的差异 看是否有定时任务 或者 新上线的活动 ,在看下监 ...