美文网首页
Django Messages

Django Messages

作者: JunChow520 | 来源:发表于2020-09-25 17:11 被阅读0次

    Django提供了基于Cookie和Session的消息框架,无论是匿名还是认证的用户。消息框架允许临时将消息存储在请求中,并在其后的下一个请求中提取并显示。每个消息都会带有一个特定消息级别的标签以表示优先级。

    消息存储

    消息框架支持使用不同的后端存储来存储临时消息,Django在django.contrib.messages类中提供了三个内建的存储类。

    存储类 描述
    storage.session.SessionStorage 存储消息于请求的会话中,需提前开启会话框架。
    storage.cookie.CookieStorage 存储消息数据到Cookie中,在请求之间传递消息。
    storage.fallback.FallbackStorage 优先使用CookieStorage然后SessionStorage

    使用Cookie存储消息时,会使用一个安全的哈希进行签名,以防止篡改。如果Cookie中数据大小超过2048字节,将会丢弃旧的消息。

    默认采用的是FallbackStorage类即首先使用CookieStorage,如果消息塞不进一个Cookie则会使用SessionStorage中,这样以避免每次都会读写Session,默认情况下它提供的性能是最好的。

    设置消息的存储方式

    $ vim settings.py
    
    MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'
    

    消息级别

    消息框架的消息级别可配置,和Python的日志模块类似。消息的级别可以根据类型进行分组,以在不同视图和模板中过滤或显示。

    内建消息级别

    django.contrib.message类中支持的内建级别

    消息级别是一个整数常量,可定义自己的级别常量。

    消息级别 整数常量 描述
    DEBUG 10 在生产部署中需忽略或删除的,与开发相关的消息。
    INFO 20 用户的信息类消息
    SUCCESS 25 操作成功
    WARNING 30 警告消息,故障没有发生,但可能即将会发生。
    ERROR 40 操作失败或发生其它故障

    MESSAGE_LEVEL配置可用来改变记录的最小级别,可在每个请求中修改,小于目标级别的消息将会被忽略。

    $ vim settings.py
    
    from django.contrib.messages import constants as message_constants
    
    MESSAGE_LEVEL = message_constants.INFO
    

    自定义消息级别

    消息级别只是一个整数常量,可自定义自己的级别常用,在视图中添加消息时使用。自定义消息级别时,应避免覆盖现有的级别。

    from django.contrib import messages
    CRITICAL = 50
    
    def myview(request):
      messages.add_message(request, CRITICAL, "A serious error occurred")
    

    最小消息级别

    自定义请求中最小消息级别

    • 请求中可通过get_level()方法获取当前最小消息级别
    from django.contrib import messages
    
    def myview(request):
      min_message_level = messages.get_level(request)
    
    • 请求中可通过set_level(request, level)方法设置最小消息记录级别
    from django.crontrib import messages
    
    def myview(request):
      messages.set_level(request, message.DEBUG)
      messages.debug(request, "debug message")
    
    • 将最小级别恢复到默认值
    def myview(request):
      messages.set_level(request, None)
    

    消息标签

    若要修改消息级别的默认标签,可设置MESSAGE_TAGS为想要修改的级别的字典。

    消息级别 标签名称
    DEBUG debug
    INFO info
    SUCCESS success
    WARNING warning
    ERROR error
    $ vim settings.py
    
    from django.contrib.messages import constants as messages
    
    MESSAGE_TAGS = {
      messages.INFO: "",
      50: "critical"
    }
    

    启用消息

    Django消息框架的实现是通过一个中间件类和对应的context processor上下文处理器构成

    1. 项目注册消息框架
    django.contrib.messages
    

    在项目配置文件settings.pyINSTALLED_APPS选项中配置django.contrib.messages以启用消息框架

    $ vim settings.py
    
    # 注册应用
    INSTALLED_APPS = [
        'django.contrib.messages',
    ]
    
    1. 项目添加消息处理中间件类
    django.contrib.messages.middleware.MessageMiddleware
    

    消息处理中间件MessageMiddleware的后端存储依赖于会话框架,因此在中间件中应该提前加载会话处理中间件SessionMiddleware

    $ vim settings.py
    
    MIDDLEWARE = [
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
    ]
    
    1. 模板中添加消息上下文处理器
    django.contrib.messages.context_processors.messages
    

    在项目配置的TEMPLATES设置中定义context_processors上下文处理器添加django.contrib.messages.context_processors.messages选项

    $ vim settings.py
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [
                os.path.join(BASE_DIR, 'templates')
            ],
            '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',
                ],
            },
        },
    ]
    

    新增消息

    在视图或模板中新增消息

    from django.contrib import messages
    
    messages.add_message(request, level, message, extra_tags="", fail_silently=False)
    

    在视图文件内导入messages类库

    from django.contrib import messages
    

    messages模块提供了successerrorinfowarning等快捷方法来处理

    快捷方法

    messages类中提供快捷方法为标准新增消息携带HTML标签,消息标签用来表示消息的HTML类型。

    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")
    

    显示消息

    显示消息的方法原型

    get_messages(request)[source]
    

    视图中可通过get_messages()方法获取消息

    from django.crontrib.messages import get_messages
    
    storage = get_messages(request)
    for message in storage:
      do_something
    

    默认情况下如果包含消息的迭代器完成迭代后,当前请求中的消息会被删除。如果需要保留消息则需显式的指定storageused参数为False

    from django.crontrib.messages import get_messages
    
    storage = get_messages(request)
    for message in storage:
      do_something
    
    storage.used = False
    

    message消息实例属性包括

    属性 描述
    message 消息实际内容文本
    level 消息级别,整数类型。
    tags 消息标签,字符串,由消息的extra_tagstags组合成成,组合以空格分隔。
    extra_tags 消息定制标签,字符串,默认为空。
    level_tags 当前消息级别对应的字符串

    在模板中显示提示消息

    通过if条件判断是否具有messages消息,messages是一个列表,比如使用for标签来循环。即使只有一条消息也需要迭代messages列表,否则在下一个请求中,上一个请求的消息不会被清除。可通过迭代出的messagetags属性获取每个消息的标签以设置CSS的样式。

    {% if messages %}
    <script>
        {% for msg in messages %}
            alert('{{ msg.message }}');
        {% endfor %}
    </script>
    {% endif %}
    
    • DEFAULT_MESSAGE_LEVELS获取其映射消息级别的名称
    • message.level获取当前消息的级别数值
    • message.tags获取消息的标签名称作为消息样式设置的根据
    {% 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 %}
    

    相关文章

      网友评论

          本文标题:Django Messages

          本文链接:https://www.haomeiwen.com/subject/imaxuktx.html