博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django messages框架
阅读量:6836 次
发布时间:2019-06-26

本文共 4233 字,大约阅读时间需要 14 分钟。

一.简介

  在网页应用中,你经常需要在处理完表单或其它类型的用户输入后,显示一个通知消息(也叫做“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'

    默认的后端存储 依赖。所以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 在 中提供三个内建的存储类:

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 导入的内建级别有:

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_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 %}
    {
    % for message in messages %}
    {
    { message }} {
    % endfor %}
{
% endif %}

三.配置使用

  以上只是简单举例使用,看更详细文档请参考 

  在生产使用中我们可以把它整合成一个模块便于调用,结合前端显示当有错误或者其它信息时浏览器可以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 %}{% endif %}
前端显示

VIEWS调用

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

 

转载于:https://www.cnblogs.com/jl-bai/p/6209653.html

你可能感兴趣的文章
Java反射
查看>>
Codeforce 712A Memory and Crow
查看>>
Keil代码中for循环延时问题
查看>>
JAX-RS(基于Jersey) + Spring 4.x + MyBatis构建REST服务架构
查看>>
ArcGIS制图之Subset工具点抽稀
查看>>
很好看的后台管理界面
查看>>
Maven 使用Eclipse构建Web项目
查看>>
用户密码加密存储十问十答,一文说透密码安全存储
查看>>
IL指令详细
查看>>
parted空闲空间添加分区
查看>>
Nginx 作为反向代理优化要点proxy_buffering
查看>>
折腾大半年,西部数据终于收购了东芝半导体业务
查看>>
http长连接和短连接
查看>>
送上最新鲜的互联网行业新闻-【2015-05-12】
查看>>
印花税下调,今天股市上涨概率很大
查看>>
如何描述一张数据表的基本信息?
查看>>
Linux系统下UDP发送和接收广播消息小例子
查看>>
Asp.net跨站脚本攻击XSS实例分享
查看>>
Linux系统下的单调时间函数
查看>>
美国人开发了一个有趣的网站,可以算出你被机器人抢饭碗的概率
查看>>