前言

在网页应用中,我们经常需要在处理完表单或其它类型的用户输入后,显示一个通知信息给用户。

对于这个需求,Django提供了基于Cookie或者会话的消息框架messages,无论是匿名用户还是认证的用户。这个消息框架允许你临时将消息存储在请求中,并在接下来的请求(通常就是下一个请求)中提取它们并显示。每个消息都带有一个特定的level标签,表示其优先级(例如info、 warning或error)。

一、启用消息框架

Django的messages消息框架的实现,依赖messages中间件和对应的context processor。

通过django-admin startproject xxx命令创建工程时,已经默认在settings.py中开启了消息框架功能需要的所有的设置:

INSTALLED_APPS中注册的'django.contrib.messages'。

MIDDLEWARE中添加'django.contrib.sessions.middleware.SessionMiddleware'和'django.contrib.messages.middleware.MessageMiddleware'。Django的messages框架默认使用的存储后端为sessions。所以Session中间件必须被启用,并出现在Message中间件之前。

TEMPLATES设置中的DjangoTemplates选项包含的'context_processors'配置项要包含'django.contrib.messages.context_processors.messages'。

二、配置消息引擎

通常我们使用默认的就好,可以跳过这节,但如果真有需要,也可以配置:

1. 存储后端

Django提供了三种内置的消息存储后端:

class storage.session.SessionStorage class storage.cookie.CookieStorage class storage.fallback.FallbackStorage

FallbackStorage是默认的存储后端。如果它不适合你的需要,你可以通过设置MESSAGE_STORAGE选择另外一个存储后端,例如:

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

2. 消息级别

消息框架的级别是可配置的,与Python的logging模块类似

Django内置的message级别有下面几种:

级别

说明

DEBUG

将在生产部署中忽略(或删除)的与开发相关的消息

INFO

普通提示信息

SUCCESS

成功信息

WARNING

警告信息

ERROR

已经发生的错误信息

3. 消息样式

通常,我们在前端HTML页面中,希望给不同级别的消息,增加不同的CSS样式,比如警告为黄色,error为红色等等。

Django为我们提供了一个默认的样式对应关系:

级别

样式

DEBUG

debug

INFO

info

SUCCESS

success

WARNING

warning

ERROR

error

也就是说SUCCESS级别的消息,在前端会被赋予一个success样式class。

若要修改消息级别的默认样式,设置MESSAGE_TAGS,按如下例子所示:。

from django.contrib.messages import constants as messages

MESSAGE_TAGS = {

messages.INFO: '',

50: 'critical',

}

三、使用消息框架

1. 添加消息

方法原型:add_message(request, level, message, extra_tags='', fail_silently=False)[source]

新增一条消息:

from django.contrib import messages

messages.add_message(request, messages.INFO, 'Hello world.')

提供请求对象request(直接用就行),消息级别、消息内容字符串三个参数即可。

或者使用下面的快捷方式

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.')

2. 显示消息

方法原型:get_messages(request)[source]

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

{% if messages %}

{% for message in messages %}

{{ message }}

{% endfor %}

{% endif %}

相关说明:

通过if判断是否有消息;

messages是一个列表,必须用for标签循环它;

即使你知道只有一条消息,也要迭代messages列表,否则下个请求中,上个请求的消息不会被清除。

可以通过message.tags拿到每个消息的CSS样式

有一个DEFAULT_MESSAGE_LEVELS变量,它映射消息级别的名称到它们的数值:

{% if messages %}

{% for message in messages %}

{% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}Important: {% endif %}

{{ message }}

{% endfor %}

{% endif %}

说明:

可以通过message.level拿到当前消息的级别数值;

将它与DEFAULT_MESSAGE_LEVELS.ERROR进行对比;

如果一样,就说明当前消息级别为ERROR,需要显示到页面上。

在模板的外面,比如视图中,可以使用get_messages()方法获取消息:

from django.contrib.messages import get_messages

storage = get_messages(request)

for message in storage:

do_something_with_the_message(message)

说明:

get_messages()返回的是存储后端的一个实例。

循环这个实例,可以获得每条消息

对于每一个消息实例,都包含下面的属性,可以在模版或视图中调用:

message: 消息的实际内容文本。不要使用message.message,直接message。

level: 消息级别,一个整数。

tags: 一个字符串,由该消息的所有标签(extra_tags和tags)组合而成,组合时用空格分割开这些标签。

extra_tags: 一个字符串,由该消息的定制标签组合而成,并用空格分割。默认为空。

level_tag: 当前消息级别对应的CSS字符串,前面介绍过。

3. 自定义消息级别

消息级别只是一个整数常量,所以,可以定义自己的级别常量,例如:

CRITICAL = 50

def my_view(request):

messages.add_message(request, CRITICAL, 'A serious error occurred.')

在自定义消息级别时,应小心避免覆盖现有级别。内置级别的值为:

级别

对应整数值

DEBUG

10

INFO

20

SUCCESS

25

WARNING

30

ERROR

40

如果你需要在HTML或CSS中使用自定义级别,则需要通过MESSAGE_TAGS设置提供相应的映射关系。

4. 自定义每个请求的最小记录级别

每个请求都可以通过set_level()方法设置最小记录级别,如下所示:

from django.contrib import messages

# 修改最小级别为DEBUG

messages.set_level(request, messages.DEBUG)

messages.debug(request, 'Test message...')

# 在另外一个视图中修改最小级别为WARNING

messages.set_level(request, messages.WARNING)

messages.success(request, 'Your profile was updated.') # 被忽略,不记录

messages.warning(request, 'Your account is about to expire.') # 记录

# 将最小级别恢复到默认值

messages.set_level(request, None)

set_level()方法接收request为第一参数,消息级别为第二参数。

类似的,当前有效的记录级别可以用get_level()方法获取:

from django.contrib import messages

current_level = messages.get_level(request)

5. 添加额外的消息CSS样式

要添加自定义的消息CSS样式,可以通过extra_tags参数:

messages.add_message(request, messages.INFO, 'Over 9000!', extra_tags='dragonball')

messages.error(request, 'Email box full', extra_tags='email')

四、消息过期机制

默认情况下,如果包含消息的迭代器完成迭代后,当前请求中的消息都将被删除。

如果你不想这么做,想保留这些消息,那么需要显式的指定used参数为False,如下所示:

storage = messages.get_messages(request)

for message in storage:

do_something_with(message)

storage.used = False

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

本文标题: django 消息框架 message使用详解

本文地址: http://www.cppcns.com/jiaoben/python/266507.html

pythonmessage用法_django 消息框架 message使用详解相关推荐

  1. WCF技术剖析之十七:消息(Message)详解(下篇)

    <WCF技术剖析(卷1)>自出版近20天以来,得到了园子里的朋友和广大WCF爱好者的一致好评,并被卓越网计算机书店作为首页推荐,在这里对大家的支持表示感谢.同时我将一直坚持这个博文系列,与 ...

  2. WCF技术剖析之十七:消息(Message)详解(上篇)

    消息交换是WCF进行通信的唯一手段,通过方法调用(Method Call)形式体现的服务访问需要转化成具体的消息,并通过相应的编码(Encoding)才能通过传输通道发送到服务端:服务操作执行的结果也 ...

  3. spring框架 AOP核心详解

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

  4. java集合框架的结构_集合框架(Collections Framework)详解及代码示例

    简介 集合和数组的区别: 数组存储基础数据类型,且每一个数组都只能存储一种数据类型的数据,空间不可变. 集合存储对象,一个集合中可以存储多种类型的对象.空间可变. 严格地说,集合是存储对象的引用,每个 ...

  5. Android系统(96)---Android 数据交换解析框架Gson使用详解

    Android 数据交换解析框架Gson使用详解 Json 是一种文本形式的数据交换格式,比 xml 更为轻量.Json 的解析和生成的方式很多,在 Android 平台上最常用的类库有 Gson 和 ...

  6. 第二章 Message组成详解

     Message组成详解 1.1JMS message组成说明 JMS message包含两部分,头和承载体. 头中提供被客户端和provider使用的元数据, 承载体包含着实际的数据. 客户端sen ...

  7. [深入浅出Cocoa]之消息(二)-详解动态方法决议(Dynamic Method Resolution)

    [深入浅出Cocoa]之消息(二)-详解动态方法决议(Dynamic Method Resolution) 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循&quo ...

  8. 定时任务框架APScheduler学习详解

    定时任务框架APScheduler学习详解 APScheduler简介 在平常的工作中几乎有一半的功能模块都需要定时任务来推动,例如项目中有一个定时统计程序,定时爬出网站的URL程序,定时检测钓鱼网站 ...

  9. python安装robotframework报错_Python3+RIDE+RobotFramework自动化测试框架搭建过程详解

    Python2.7已于2020年1月1日开始停用,之前RF做自动化都是基于Python2的版本. 没办法,跟随时代的脚步,我们也不得不升级以应用新的控件与功能. 升级麻烦,直接全新安装. 一.Pyth ...

最新文章

  1. python导入excel数据-python + Excel数据读取(更新)
  2. 在 Linux CentOS 上安装 Couchbase Server
  3. VC里的#define new DEBUG_NEW
  4. chrome自动提交文件_实用!8个 chrome插件玩转GitHub,单个文件下载小意思
  5. Django讲课笔记01:Django简介
  6. 一个程序如何连接到外网_如何从头开始开发一个微信小程序
  7. R 指定安装镜像的方法
  8. 20200815:力扣201周周赛题解记录下
  9. 【离散数学】单向连通和弱连通的区别
  10. Spring Cloud 和 Dubbo,到底用哪个好?
  11. C# 找出实现某个接口的所有类
  12. 万年历的c语言程序代码含节假日,用C语言编写的万年历程序代码
  13. layui 表格表头最右侧多一列 解决办法
  14. RFID的现状与今后动向 - 2.1 周波数的动向
  15. Excel 2010 SQL应用048 比较两列数据是否相同
  16. 图像JPEGEXIF格式介绍(一)
  17. ES异常 : Validation Failed: 1: no requests added
  18. 1.3 基于协同过滤的电影推荐案例
  19. poj-openjudge 1042:Moles 解题报告
  20. 互联网开放平台纵横论

热门文章

  1. php Function split() is deprecated 的解决办法(转)
  2. 怎样写C代码——《狂人C》习题解答1(第一章习题7)
  3. linux程序获取透传参数,Linux内核中TCP SACK处理流程分析
  4. bool类型头文件_[C++基础入门] 2、数据类型
  5. python与c混合编程 版本_python与C、C++混编的四种方式(小结)
  6. jvm 参数_6个重要的JVM性能参数
  7. android bitmap转图片_Android 这些 Drawable 你都会用吗?
  8. linux 查询内存和核心数,Linux下查看操作系统信息、内存情况及cpu信息:cpu个数、核心数、线程数...
  9. combus通讯_Vue兄弟组件通信Bus传值--小案例
  10. 【mathematical statistics】5 distributional testing