消息框架 message

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

对于这个需求,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

已经发生的错误信息

MESSAGE_LEVEL设置可以用来改变记录的最小级别(参考前面的Django设置章节),小于这个级别的消息将被忽略。

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 messagesMESSAGE_TAGS = {

messages.INFO: ‘‘,

50: ‘critical‘,}

三、使用消息框架

1. 添加消息

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

新增一条消息:

from django.contrib import messagesmessages.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 %}

<ul class="messages">

{% for message in messages %}

<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>

{% endfor %}

</ul>

{% endif %}

相关说明:

  • 通过if判断是否有消息;
  • messages是一个列表,必须用for标签循环它;
  • 即使你知道只有一条消息,也要迭代messages列表,否则下个请求中,上个请求的消息不会被清除。
  • 可以通过message.tags拿到每个消息的CSS样式

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

{% if messages %}

<ul class="messages">

{% for message in messages %}

<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>

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

{{ message }}

</li>

{% endfor %}

</ul>

{% 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

# 修改最小级别为DEBUGmessages.set_level(request, messages.DEBUG)messages.debug(request, ‘Test message...‘)

# 在另外一个视图中修改最小级别为WARNINGmessages.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 messagescurrent_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

原文地址:https://www.cnblogs.com/dontgiveup/p/9795750.html

时间: 2024-10-13 08:27:38

消息框架 message的相关文章

消息框架的一种实现

自从在Android中用上了消息框架,屡试不爽.不管是主线程发任务到后台线程,还是后台线程返回结果到主线程,甚至是完全在主线程中的调用,都用发消息-监听消息-收消息这种方式处理,真是解耦利器. 之前写过的两篇文章:用消息机制获取网络数据 和 用消息机制解耦Activity跳转. 之前在工程中都用的是开源的EventBus,很好用,但是因为是定制好的,缺少很多灵活性,监听方法不可改名,不可从父类override,不可以通过泛型参数声明,等等. 自己尝试用Handler实现了一个消息框架,还没完全搞

[编织消息框架]前言

出书缘由 本项目名叫onequeue意为一流消息队列,参考对象为kafka 虽然最终结果可能达不到一流水准,但那不是主要的,主要是做的心态保持一流的态度 为什么作为kafka参考,又为什么自己重新做? 我在预研kafka发现在发送消息时网络断开会造成消息丢失,而底层没有提供失败回调给开发者使用,在某些场景来讲不允许丢消息的 进一步深入看下源码,虽然某些领域kafka开者人员很熟悉但综合水平觉得不如我,所以产生写消息框架的想法 面向读者 如果你喜欢网络传输,数据存储方向,那么本书会非常适合你,但你

P2922 [USACO08DEC]秘密消息Secret Message

P2922 [USACO08DEC]秘密消息Secret Message 题目描述 Bessie is leading the cows in an attempt to escape! To do this, the cows are sending secret binary messages to each other. Ever the clever counterspy, Farmer John has intercepted the first b_i (1 <= b_i <= 1

NATS学习 -- 概念学习之消息(Message)与发布订阅(Publish Subscribe)

1 理论篇 1.1 来自官方的介绍 NATS acts as a central nervous system for distributed systems such as mobile devices, IoT networks, enterprise microservices and cloud native infrastructure. Unlike traditional enterprise messaging systems, NATS provides an always o

Android 中的消息模型(Message,MessageQueue,handle,looper)

Android 中的消息模型(Message,MessageQueue,handle,looper,) Android 中的消息通讯 1.Android 中线程的应用机制? 1)Android 中所有的耗时操作应在工作线程执行. 2)Android 中所有的UI操作应该在主线程(UI线程)执行. FAQ? 1)主线程执行执行耗时操作好吗? 不好,这样会阻塞UI操作. 2)工作执行完耗时操作,假如有数据要传递给主线程,那如何实现? 2.Android 中多线程应用时的消息模型? 使用Android

Unity3D 消息框架设计

先考虑需要实现的基本功能: 在任意一个地方增加一个消息的listener,则当这个消息被broadcast的时候,所有的listener都应该收到.考虑到delegate(我的理解是本身就是为实现观察者模式而出现的类),另外有个dict保存消息名和Delegate的对应. 定义一个static消息类Messenger. 1 static internal class Messenger 2 { 3 private static Dictionary<string, Delegate> even

【消息】Message使用

实例1 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const WM_ME=WM_USER+100; //自定义消息: type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); //第一种

JMS消息服务器——Message消息分析(1)

一.Message结构 Message消息是整个JMS规范最为重要的部分.一个JMS应用程序中的所有数据和事件都是使用消息进行通信的,同时JMS的其余部分也都在为消息传输服务.因此可以说,消息时一个系统的命脉所在. 一个Message对象有3个部分:消息头.消息属性,最后就是消息数据内容,它称为负载或消息体. 二.消息头 每条JMS消息都有一组标准的消息头.每个消息头都由一组取值函数和赋值函数所标识.这些方法名称紧随在术语setJMS**(),getJMS**()方法之后.如下图: JMS消息可

JMS消息服务器——Message消息分析(2)

3 消息类型 JAVA消息服务定义了6种JMS提供者必须支持的Message接口类型.尽管JMS定义了Message接口,但它并未定义它们的实现方式.这就允许提供者以它们自己的方式实现和传送消息,同时为JMS应用程序开发者维护了一个兼容的标准接口.这6个消息接口是Message和它的5个子接口:TextMessage.StreamMessage.MapMessage.ObjectMessage和ByteMessage. 3.1 Message 最简单的消息类型是javax.jms.Message