message组件可以某次请求的某些数据暂存起来,当后面请求需要的时候可以再次使用,同时删除这些存起来的数据
相对于cookie,message将数据存在server端,在需要使用的时候,再将数据拿走
1.配置
message组件是Django内置的功能,只要在配置文件中设置如下Django默认是开启message组件的
-
注册message应用
INSTALLED_APPS = [ ... 'django.contrib.messages', ]
- 使用中间件
MIDDLEWARE = [ ... 'django.contrib.messages.middleware.MessageMiddleware', ... ]
- 模板设置
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], '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', ], }, }, ]
- message存储形式
# 将数据存储在session和cookie中 # MESSAGE_STORAGE = 'django.contrib.messages.storage.fallback.FallbackStorage' # 将数据存储在cookie中 # MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage' # 将数据存储在session中 MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
2.python代码操作
- 添加值
from django.contrib import messages message = messages.add_message(request, messages.SUCCESS, '添加数据1', '额外数据1') message = messages.add_message(request, messages.SUCCESS, '添加数据2', '额外数据2')
读取值
-
视图中获取数据
from django.contrib.messages import get_messages messages = get_messages(request) for msg in messages: print(msg)
- 模板中获取数据
<ul> {% for message in messages %} <li>{{ message.tags }} {{ message }}</li> {% endfor %} </ul>
3.源码分析
-
在中间件request中初始化一个存储对象,存储对象可以根据配置文件中的MESSAGE_STORAGE进行设置
-
在视图函数中添加数据,将数据封装在存储对象中
-
在中间件的response中,将存储对象中的数据保存到内存中
-
当在视图或者模板文件中遍历存储对象的时候,就会设置used标志
-
在中间件的response中,将使用的数据从内存中清除