Django messages框架
Posted jl_bai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django messages框架相关的知识,希望对你有一定的参考价值。
一.简介
在网页应用中,你经常需要在处理完表单或其它类型的用户输入后,显示一个通知消息(也叫做“flash message”)给用户
对于这个功能,Django 提供基于Cookie 和会话的消息,无论是匿名用户还是认证的用户。
其消息框架允许你临时将消息存储在请求中,并在接下来的请求(通常就是下一个请求)中提取它们并显示。每个消息都带有一个特定level 标签,表示其优先级(例如info、warning 或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 中提供三个内建的存储类:
-
这个类存储消息数据于与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 导入的内建级别有:
Constant | Purpose |
---|---|
DEBUG | Development-related messages that will be ignored (or removed) in a production deployment |
INFO | Informational messages for the user |
SUCCESS | An action was successful, e.g. “Your profile was updated successfully” |
WARNING | A failure did not occur but may be imminent |
ERROR | An action was not successful or some other failure occurred |
MESSAGE_LEVEL 设置可以用来改变记录的最小级别(它还可以在每个请求中修改)。小于这个级别的消息将被忽略。
若要修改消息级别的默认标签,设置MESSAGE_TAGS为包含你想要修改的级别的字典
from django.contrib.messages import constants as messages MESSAGE_TAGS = { messages.INFO: \'\', 50: \'critical\', }
3.3 在视图及模板中使用
add_message(request, level, message, extra_tags=\'\', fail_silently=False)
例
新增消息
from django.contrib import messages messages.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_constants MESSAGE_LEVEL = message_constants.INFO 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\', ], }, }, ]
#!/usr/bin/env python # -*- coding: utf-8 -*- from django.contrib import messages def 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\'
{% 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框架的主要内容,如果未能解决你的问题,请参考以下文章