- 13.3节:分页管理
- 已经是最后一篇了
系统地讲解Django开发的基础知识, 高阶知识。关注微信公众号[薯条编程],领取该教程的PDF电子书:《Python web开发-django从入门到精通》。
13.4.1 消息处理框架messages
网站在处理表单和用户输入时,经常会根据用户请求和输入内容进行消息提醒。比如用户输入敏感信息然后提交表单,网站捕捉到敏感信息后弹出一个消息提醒:
在django中可以使用内置的消息框架messages对站内消息进行处理。messages框架在其内部实现中,将临时消息以cookie或session的方式存储在请求中,并在下一次请求中提取并显示。
在13.1节中详细地讲解了django中的日志处理,每一条日志消息对应一个日志级别。同样地,在django的消息框架中,每条消息也对应一个级别。对消息设置级别,主要用来对消息类型进行分组处理,比如提示消息,警告消息,错误消息。
13.4.2 启用或禁止messages框架
messages框架的实现基于middleware类型以及上下文处理器context processor, 我们如需在项目中启用messages框架,必须在settings.py中将messages框架的所有依赖进行配置。下表为启用messages框架所必须配置的选项:
| 描述 |
'django.contrib.messages' | 在INSTALLED_APPS中进行配置 |
'django.contrib.sessions.middleware.SessionMiddleware' | 在MIDDLEWARE中进行配置 |
'django.contrib.messages.middleware.MessageMiddleware' | 在MIDDLEWARE中进行配置 |
在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视频课程。
小班授课,薯条老师一对一教学,火热报名中,点击了解线下就业培训。
- 13.3节:分页管理
- 已经是最后一篇了