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中,将使用的数据从内存中清除

posted on 2022-11-17 10:45  阿明明  阅读(135)  评论(0编辑  收藏  举报