专栏首页Devops专栏Django 2.1.7 使用内置messages显示通知消息

Django 2.1.7 使用内置messages显示通知消息

需求

在Web应用程序中,有时候需要在处理表单或其他类型的用户输入后向用户显示一次性通知消息(也称为“flash消息”),例如:用户注册成功、订单提交完成等信息。

为此,Django为匿名和经过身份验证的用户提供对基于cookie和session存储数据的消息传递框架。该消息框架允许将消息临时存储在一个请求中并检索它们以便在后续请求(通常是下一个请求)中显示。每个消息被标记以特定的level确定其优先级(例如,info, warning,或error)。

这个消息框架的数据传递方式基本就是我上一篇Django 2.1.7 redirect重定向数据传输的问题 中使用session的参数传递方式。

Django官网文档

https://docs.djangoproject.com/zh-hans/2.1/ref/contrib/messages/

在项目settings启用内置messages消息框架

  • django.contrib.messages需要安装在应用INSTALLED_APPS中,如下:
INSTALLED_APPS = (
    ...
    'django.contrib.messages', # django 内置的消息传递应用
)
  • 中间件MIDDLEWARE需要包含 'django.contrib.sessions.middleware.SessionMiddleware''django.contrib.messages.middleware.MessageMiddleware'
MIDDLEWARE = (
    ....
    'django.contrib.sessions.middleware.SessionMiddleware',
    ....
    'django.contrib.messages.middleware.MessageMiddleware',
    ...
)

默认存储后端依赖于session。这就是为什么SessionMiddleware 必须启用在MessageMiddleware的前面。

  • TEMPLATES设置包含'django.contrib.messages.context_processors.messages'
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', # 默认已有
            ],
        },
    },
]

在视图和模板中使用消息

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

显示消息

get_messages

在模板中,读取消息示例如下:

{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
    {% endfor %}
</ul>
{% endif %}

如果在视图中使用上下文处理器,则应使用 RequestContext。确保messages可用于模板上下文。

即使您知道只有一条消息,您仍应迭代messages序列,否则将不会为下一个请求清除消息存储。

上下文处理器还提供了一个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 %}

在模板之外,可以使用 get_messages()来获取消息:

from django.contrib.messages import get_messages

storage = get_messages(request)
for message in storage:
    do_something_with_the_message(message)

例如,您可以获取所有消息以在JSONResponseMixin中返回它们 而不是 TemplateResponseMixin

get_messages() 将返回已配置的存储后端的实例。

消息使用示例

在视图A发出一个messages消息记录,然后在视图B显示一次消息内容。

1)编写视图A,添加两个消息

from django.contrib import messages

def send_alert_msg(request):
    # 添加消息
    messages.add_message(request, messages.SUCCESS, 'successful msg!!')
    messages.add_message(request, messages.ERROR, 'error msg!!')
    return redirect('assetinfo:show_msg')

2)编写视图B,转发显示消息内容

def show_msg(request):
    return render(request,'alert_msg/show_msg.html')

模板内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    {% if messages %}
    <ul class="messages">
        {% for message in messages %}
        <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
        {% endfor %}
    </ul>
    {% endif %}

    <h4>通过tags判断messages类型</h4>

    {% if messages %}
    <ul class="messages">
        {% for message in messages %}
            {% if message.tags == "success" %}
                <li class="{{ message.tags }}">{{ message }}</li>
            {% elif message.tags == "error" %}
                <li class="{{ message.tags }}">{{ message }}</li>
            {% endif %}
        {% endfor %}
    </ul>
    {% endif %}

</body>
</html>

3)在配置视图url

urlpatterns = [
    # ex:/assetinfo/send_alert_msg
    path('send_alert_msg', views.send_alert_msg, name='send_alert_msg'),
    # ex:/assetinfo/show_msg
    path('show_msg', views.show_msg, name='show_msg'),
]

4) 测试访问发送消息视图

在浏览器访问http://127.0.0.1:8000/assetinfo/send_alert_msg则自动重定向并显示消息如下:

5) 直接再次访问接收消息视图

因为没有发送消息,所以消息接收为空。说明消息是一次性的,但是如果多次只发送不显示处理消息数据,则会在cookie或者session存储后端中堆积起来,在最后一次处理消息数据的时候一次性显示出来。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python 进程之间的通信 - 队列Queue

    Process并不能像线程那样共享全局变量,那么它们之间如果有传递值的需求,那么该怎么办呢? 对于这种需求,操作系统提供了很多机制来实现进程间的通信,例如队列...

    Devops海洋的渔夫
  • Django配置runserver实现远程访问

    如果是在另一台电脑上web访问要用 python manage.py ip:port (一般使用8000)的形式;监听所有ip用0.0.0.0如下:

    Devops海洋的渔夫
  • 在Django 2.2中启动开发服务器时处理SQLite3错误

    当python3 manage.py runserver启动django项目的时候,就会出现报错信息如下: django.core.exceptions.Im...

    Devops海洋的渔夫
  • Django messages 消息(下)

    有几个快捷方法提供标准的方式来新增消息并带有常见的标签(这些标签通常表示消息的 HTML 类型)

    小团子
  • 2018斯坦福CS 20深度学习Tensorflow实战课程(附PPT下载)

    【导读】斯坦福大学在2017年开设了一门深度学习Tensorflow实战课程(Tensorflow for Deep Learning Research),广受...

    WZEARW
  • 国内领先!招商银行四个项目全部通过 DevOps 标准认证

    2018年11月2日,在深圳召开的 DevOps 国际峰会(DOIS)上,招商银行获得由中国信息通信研究院(以下简称信通院)颁发的《研发运营一体化(DevOps...

    DevOps时代
  • 图形工具解析-静电的Figma完全学习日记-Day.03

    静电说:啊,Figma的文章已经连载到Day03了,我会坚持给大家分享。不过在这期间很多的人还是不能接受这种方式的,甚至在留言的时候言辞很激烈。还有人问我,设计...

    用户5009027
  • Linux架构之HA配置

    简介 通过安装该Linux-HA软件,可以实现Linux双机系统的高可用性解决方案,实现双机系统的热备份,并能够做到双机之间的无缝切换,从而对外 提供稳定可靠...

    小小科
  • Solidity 安全:已知攻击方法和常见防御模式综合列表

    以太坊智能合约的特点之一是能够调用和利用其他外部合约的代码。合约通常也处理 Ether,因此通常会将 Ether 发送给各种外部用户地址。调用外部合约或将以太网...

    辉哥
  • 分布式系统高可用实战之限流器(Go 版本实现)

    1. 问题描述2. 信号量限流2.1 阻塞方式2.2 非阻塞方式3. 限流算法3.1 漏桶算法3.2 令牌桶算法3.3 漏桶算法的实现改进4. Uber 开源实...

    aoho求索

扫码关注云+社区

领取腾讯云代金券