首页 > 代码库 > Django messages框架

Django messages框架

一.简介

  在网页应用中,你经常需要在处理完表单或其它类型的用户输入后,显示一个通知消息(也叫做“flash message”)给用户

对于这个功能,Django 提供基于Cookie 和会话的消息,无论是匿名用户还是认证的用户。

其消息框架允许你临时将消息存储在请求中,并在接下来的请求(通常就是下一个请求)中提取它们并显示。每个消息都带有一个特定level 标签,表示其优先级(例如infowarning 或error

二.启用消息框架 

消息框架的实现通过一个中间件 类和对应的context processor。

django-admin startproject 创建的默认settings.py  已经包含启用消息框架功能需要的所有的设置:

  • INSTALLED_APPS 中的‘django.contrib.messages‘

  • MIDDLEWARE_CLASSES 中的‘django.contrib.sessions.middleware.SessionMiddleware‘ 和‘django.contrib.messages.middleware.MessageMiddleware‘

    默认的后端存储 依赖sessions。所以MIDDLEWARE_CLASSES 中必须启用SessionMiddleware 并出现在MessageMiddleware 之前。

  • TEMPLATES 设置中定义的DjangoTemplates 的‘context_processors‘ 选项包含‘django.contrib.messages.context_processors.messages‘

如果你不想使用消息框架,你可以删除INSTALLED_APPS 中的 ‘django.contrib.messages‘MIDDLEWARE_CLASSES 中的MessageMiddleware 和TEMPLATES 中的messages context processo

2.1 配置消息框架引擎

  

消息框架可以使用不同的后台存储临时消息。

Django 在django.contrib.messages 中提供三个内建的存储类:

class storage.session.SessionStorage

这个类存储所有的消息于请求的会话中。因此,它要求启用Django 的contrib.sessions 应用。

class storage.cookie.CookieStorage

这个类存储消息数据于与Cookie 中(已经用一个安全的哈希进行签名以防止篡改)以在请求之间传递消息。如果Cookie 数据的大小将超过2048 字节,将丢弃旧的消息。

class storage.fallback.FallbackStorage

这个类首先使用CookieStorage,如果消息塞不进一个Cookie 中则使用SessionStorage。 它同样要求启用Django 的contrib.sessions 应用。

这个行为避免每次都写会话。在通常情况下,它提供的性能应该是最好的。

FallbackStorage 是默认的存储类。如果它不适合你的需要,你可以通过设置 MESSAGE_STORAGE 为它的完整导入路径选择另外一个存储类,例如:

MESSAGE_STORAGE = django.contrib.messages.storage.cookie.CookieStorage

3.3 消息级别

  消息框架的级别是可配置的,与Python logging 模块类似。消息的级别可以让你根据类型进行分组,这样它们能够在不同的视图和模板中过滤或显示出来

django.contrib.messages 导入的内建级别有:

ConstantPurpose
DEBUGDevelopment-related messages that will be ignored (or removed) in a production deployment
INFOInformational messages for the user
SUCCESSAn action was successful, e.g. “Your profile was updated successfully”
WARNINGA failure did not occur but may be imminent
ERRORAn action was not successful or some other failure occurred

MESSAGE_LEVEL 设置可以用来改变记录的最小级别(它还可以在每个请求中修改)。小于这个级别的消息将被忽略。

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

from django.contrib.messages import constants as messagesMESSAGE_TAGS = {    messages.INFO: ‘‘,    50: critical,}

3.3 在视图及模板中使用

add_message(request, level, message, extra_tags=‘‘, fail_silently=False)

例 

新增消息

from django.contrib import messagesmessages.add_message(request, messages.INFO, Hello world.)

有几个快捷方法提供标准的方式来新增消息并带有常见的标签(这些标签通常表示消息的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.)

3.4 显示消息

get_messages(request)

在你的模板中,像下面这样使用:

{% if messages %}<ul class="messages">    {% for message in messages %}    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>    {% endfor %}</ul>{% endif %}

三.配置使用

  以上只是简单举例使用,看更详细文档请参考 https://docs.djangoproject.com/en/1.10/ref/contrib/messages/

  在生产使用中我们可以把它整合成一个模块便于调用,结合前端显示当有错误或者其它信息时浏览器可以alert消息

技术分享
from django.contrib.messages import constants as message_constantsMESSAGE_LEVEL = message_constants.INFOTEMPLATES = [    {        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,            ],        },    },]
settings
技术分享
#!/usr/bin/env python# -*- coding: utf-8 -*-from django.contrib import messagesdef flash(request, title, text, level=info):    """    利用django的message系统发送一个信息。    """    level_map = {        info: messages.INFO,        debug: messages.DEBUG,        success: messages.SUCCESS,        warning: messages.WARNING,        error: messages.ERROR    }    level = level_map[level]    messages.add_message(request, level, text, extra_tags=title)    return ok
message method
技术分享
{% if messages %}<script>    {% for msg in messages %}        alert({{ msg.message }});    {% endfor %}</script>{% endif %}
前端显示

VIEWS调用

 result = XXXXX      if result:         flash(request,"success", "成功!")      else:         flash(request,"error",  "。。。。")

 

Django messages框架