Django入门教程

前言

第一章: django快速入门

第二章: django MTV架构

第三章: django视图

第四章: django模板

第五章: django模型

第六章: django后台管理系统

第七章: 项目实战-简易的博客系统

第八章:django表单

第九章:django用户认证系统

第十章:django中的会话

第十一章:django安全

第十二章:django性能优化

第十三章:django实用工具

首页 > Django入门教程 > 第十三章:django实用工具 > 13.4节:消息框架

13.4节:消息框架

薯条老师 2020-10-27 07:21:47 229667 0

编辑 收藏

系统地讲解Django开发的基础知识, 高阶知识。关注微信公众号[薯条编程],领取该教程的PDF电子书:《Python web开发-django从入门到精通》。

13.4.1 消息处理框架messages

网站在处理表单和用户输入时,经常会根据用户请求和输入内容进行消息提醒。比如用户输入敏感信息然后提交表单,网站捕捉到敏感信息后弹出一个消息提醒:

 消息提醒.png

在django中可以使用内置的消息框架messages对站内消息进行处理。messages框架在其内部实现中,将临时消息以cookie或session的方式存储在请求中,并在下一次请求中提取并显示。

在13.1节中详细地讲解了django中的日志处理,每一条日志消息对应一个日志级别。同样地,在django的消息框架中,每条消息也对应一个级别。对消息设置级别,主要用来对消息类型进行分组处理,比如提示消息,警告消息,错误消息。

13.4.2 启用或禁止messages框架

messages框架的实现基于middleware类型以及上下文处理器context processor, 我们如需在项目中启用messages框架,必须在settings.py中将messages框架的所有依赖进行配置。下表为启用messages框架所必须配置的选项:

messages框架的启用选项

 

描述

'django.contrib.messages'

在INSTALLED_APPS中进行配置

'django.contrib.sessions.middleware.SessionMiddleware'

在MIDDLEWARE中进行配置

'django.contrib.messages.middleware.MessageMiddleware'

在MIDDLEWARE中进行配置

'django.contrib.messages.context_processors.messages'

在TEMPLATES选项中的context_processors中进行配置

打开settings.py, 可以发现django已经自动对消息框架的启用选项进行了配置:

INSTALLED_APPS = [
    'suit',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
    'debug_toolbar',
    'template_profiler_panel'
]
 
MIDDLEWARE = [
    'debug_toolbar.middleware.DebugToolbarMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
 
ROOT_URLCONF = 'chipscoco.urls'
 
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',
                'django.template.context_processors.request'
            ],
        },
    },
]

如需禁用消息框架,只需将INSTALLED_APPS中的'django.contrib.messages', MIDDLEWARE中的'django.contrib.messages', 以及TEMPLATE中的'django.contrib.messages.context_processors.messages'删除即可。

13.4.3 配置messages框架

(1) 配置存储引擎

messages框架中的存储引擎用来存储临时消息,下表所示为django中的消息存储引擎:

消息存储引擎类型

 

描述

storage.session.SessionStorage

将消息存储于session中,使用该存储引擎时,必须先在INSTALLED_APPS中配置contrib.sessions选项

storage.cookie.CookieStorage

将消息存储于cookie中,如果超出cookie的存储阈值(通常为2048个字节),会丢弃旧消息

storage.fallback.FallbackStorage

消息框架的默认配置,先尝试在CookieStorage中进行存储,如果在单个cookie中无法进行存储,会转而在SessionStorage中进行存储

配置messages框架的存储引擎很简单,直接在settings.py中通过全局变量MESSAGE_STORAGE进行配置。

例如将存储引擎配置为SessionStorage:

MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'

(2) 配置消息级别

消息框架中的消息级别主要用来对消息类型进行分组处理,在django中定义了以下消息级别:

消息级别

 

描述

DEBUG

调试消息,主要用于项目开发时的程序调试

INFO

普通的用户提示消息

SUCCESS

用户提示消息,提示用户操作成功

WARNING

警告消息,提示用户的操作可能会引发某种错误

ERROR

错误消息,提示用户操作失败,在操作的过程中引发了某种错误

settings.py中通过全局的MESSAGE_LEVEL对消息级别进行配置,消息级别所对应的常量可以直接从django.contrib.messages 中导出。以下是对消息的基准级别进行配置的例子:

# 导入消息常量
from django.contrib.messages import constants as message_constants
# 配置消息级别为INFO
MESSAGE_LEVEL = message_constants.INFO

(3) 配置消息样式

消息级别主要用来对消息类型进行分组处理,对于不同类型的消息,我们可以指定不同的CSS样式。在默认情况下,django对每一个消息级别指定了一个默认的CSS样式。

消息级别

 

CSS类名

DEBUG

debug

INFO

info

SUCCESS

success

WARNING

warning

ERROR

error

以消息级别ERROR进行举例,django在进行页面渲染时,会自动对ERROR级别的消息添加一个名为error的css class:

<span >{{ message }}</span>

在settings.py中对消息级别的样式进行配置:

from django.contrib.messages import constants as messages
 
# 通过全局变量MESSAGE_TAGS来进行配置
# MESSAGE_TAGS是一个字典类型,键名为消息级别,键值为CSS 类名
MESSAGE_TAGS = {
  messages.SUCCESS: 'great',
  messages.ERROR: 'critical',
}

13.4.4 使用messages框架

(1) 在视图中添加消息

使用消息框架的add_message方法添加消息:

from django.contrib import messages
messages.add_message(request,  level,  message,  extra_tags='', fail_silently=False)

参数request表示视图的请求对象,level表示消息级别,message表示消息内容,extra_tags用来指定额外的CSS样式,fail_silently表示是否忽略消息处理过程中的错误。在视图中添加消息的快捷方法,每一个快捷方法使用的为消息级别的默认样式:

from django.contrib import messages
 
# debug方法对应的消息级别为DEBUG,使用的是默认的debug样式,以此类推
messages.debug(request, 'debug message' )
 
messages.info(request, 'info message')
messages.success(request, 'success message')
messages.warning(request, 'warning message')
messages.error(request, 'error message')

同日志处理一样,在添加消息时,可以先设置一个基准级别,设置基准级别以后,优先级小于该级别的将不再显示。通过messages的set_level方法来设置基准级别:

from django.contrib import messages
 
# 设置基准级别为INFO
messages.set_level(request, messages.INFO)
# 那么debug消息将不再显示
messages.debug(request, 'Test message...')

如需设置为默认配置,那么直接在set_level中传递一个参数None:

# 传递参数None, 将消息级别设置为默认配置,
messages.set_level(request, None)

(2) 在模板中显示消息

在视图中添加消息以后,上下文处理器会自动传递一个messages的模板变量。以下为在模板中显示消息的示例代码:

{# 确保模板变量messages可用 #}
{% if messages %}

    <ul>
    {# 对所有消息进行迭代显示 #}
    {% for message in messages %}
    {# 如果当前消息有定义CSS样式,则设置为对应的CSS clss #}
         <li{% if message.tags %}  class="{{ message.tags }}"{% endif %}>
         {# 上下文处理器同时提供了一个DEFAULT_MESSAGE_LEVELS变量 #}
         {# 该变量所定义的消息级别同消息框架中的级别一一对应 #}
 
         {# 如果当前消息的级别为ERROR,则进行额外处理 #}
         {% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %} ERROR: {% endif %}
         {{ message }}
         </li>
    {% endfor %}
    </ul>
{% endif %}

django同时支持在模板外(视图中)获取消息,通过messages的get_messages方法:

from django.contrib.messages import get_messages
 
# 通过get_messages方法来获取所有消息,参数为request对象
storage = get_messages(request)
 
for message in storage:
    # 定义对消息进行处理的逻辑
    # do_something_with(message)
    pass

在默认情况下,对消息进行迭代时,django会将该消息标记为删除,并在消息被处理以后正式删除。为避免消息被删除,需要重置消息类型的used属性为False:

from django.contrib.messages import get_messages

# 通过get_messages方法来获取所有消息,参数为视图中的request对象
# 在实际测试时,需要在视图中进行测试
storage = get_messages(request)
 
for message in storage:
    # 定义对消息进行处理的逻辑
    # do_something_with(message)
    pass
 
# 重置used属性为False
storage.used = False

关注微信公众号:薯条编程,公众号后台回复"Python资料",免费领取Python电子书,以及学习Python视频课程。

小班授课,薯条老师一对一教学,火热报名中,点击了解线下就业培训。



欢迎 发表评论: