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

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‘,
            ],
        },
    },
]

settings

#!/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‘

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",  "。。。。")
时间: 2024-10-13 11:24:57

Django messages框架的相关文章

记Angular与Django REST框架的一次合作(2):前端组件化——Angular

注:这是这个系列的第二部分,主要集中在Angular的使用方面.之前使用过AngularJS(Angular 1.x),混在Django的模板中使用,这些页面一般完全是结果展示页.在有Django表单输入的页面中,就很难将两者很好的结合起来.自己在学习新版的Angular时,跟了2遍官方网站的“英雄指南”教程.第1次完全是照搬,熟悉了一下基本概念:第2次自己做了一些修改,写了一个图片分享系统(只有一个雏形,还不是特别完善). 推荐IDE:Visual Studio Code 代码: github

python Django Wbe框架教程

python  Django Wbe框架教程 一.简介 Django 中提供了开发网站经常用到的模块,常见的代码都为你写好了,通过减少重复的代码,Django 使你能够专注于 web 应用上有 趣的关键性的东西.为了达到这个目标,Django 提供了通用Web开发模式的高度抽象,提供了频繁进行的编程作业的快速解决方法,以及为“如何解决问题”提供了清晰明了的约定.Django的理念是DRY(Don't Repeat Yourself)来鼓励快速开发! 让我们一览 Django 全貌 urls.py

Django—— 缓存框架

译者注:1.无用的,吹嘘的说辞不翻译:2.意译,很多地方不准确. 动态网站最为重要的一点就是好,网页是动态的.每一次用户请求页面,网站就要进行各种计算——从数据库查询,到render模板,到各种逻辑运算——生成页面所需的.这个过程是异常消耗资源的,远远比从硬盘读取一个文件然后显示出来的代价高昂. 对于大多数中小网站来说,这也许不是问题,因为他们的访问量不大,而对于大型网站而言,必须尽量减少不必要的服务器资源开支. 因此,有了缓存技术. 缓存就是把一些需要消耗很多资源的计算结果保存下来,当下次需要

Django 六大框架之 Models

  先睹为快 from django.db import models class Person(models.Model):     first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30)   核心要点 每一个model 是 django.db.models.Model 的子类       --> 数据库表 每一个model属性 是 django.db.models.Fil

Linux(CentOS7)系统中部署Django web框架

1. 概述 部署django和vue架在逻辑上可以分为web层与数据库层:web前端通过实现了WSGI协议的模块对python代码进行解析,而python代码中则通过特定于数据库的操作接口对数据库进行读取与写入. Django自身内置了轻量级的web服务器与sqlite数据库,可以用于简单的代码测试,并支持Apache httpd与Nginx作为web前端,以及PostgreSQL/MySQL/Oracle等数据库作为后端存储,用于实际的生产环境. 本文分别以MySQL + Apache htt

测开大佬告诉你:如何5分钟快速创建restful风格的API接口-使用django restframework框架

一.思考?? 1.创建API接口难吗? 软件测试工程师: 只测过API接口, 从没创建过 应该需要掌握一门后端开发语言和后端开发框架吧!? 脑容量有限,想想就可怕 2.如何创建API接口呢? 使用Django restframework能快速创建符合restful风格的API接口 通过Django restframework框架提供的序列化器.视图集可轻轻松松实现 简单高效,学习成本低 二.搭建项目工程???? 1.创建项目 打开pycharm 创建项目 使用豆瓣源安装Django Django

Django进阶 messages框架

在 web 应用程序中,通常需要在处理表单或其他类型的用户输入之后,向用户显示一个通知消息(也称为 flash message).对于这个功能,Django 提供基于 Cookie 和会话的消息,无论是匿名用户还是认证的用户.消息框架允许临时将消息存储在请求中,并在下一个请求中提取它们并显示.每个消息都带有一个特定 level 标签,表示其优先级. 启用消息框架 消息框架的实现通过一个中间件类和对应的上下文处理器.django-admin startproject 命令创建的默认 setting

Django contenttypes 框架详解

一.什么是Django ContentTypes? Django ContentTypes是由Django框架提供的一个核心功能,它对当前项目中所有基于Django驱动的model提供了更高层次的抽象接口. 当然我们不是说的是http中的content-type!完全没有任何关系!下面将一步一步解释Django ContentTypes在Django框架中做了什么,以及如何使用Django ContentTypes. 当然,如果对于ContentTypes有了初步了解而只是不了解它的应用场景,可

01 Django web框架的原理

Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. socket服务端 import socket sk = socket.socket() sk.bind(("127.0.0.1", 80)) sk.listen() while True: conn, addr = sk.accept() data = conn.recv(8096) conn.send(b"O