Django4。xMessage消息使用示例和配置方法
Django提供了基于 Cookie 或者 Session 的消息框架 Message,不管是匿名用户还是认证的用户,这个消息框架允许临时将消息存储在 Request请求中,并在接下来的请求(通常就是下一个请求)中提取并显示或者进行应用处理。每个消息都带有一个特定的 level 等级标签,表示其优先级(例如 info 、 warning 或 error)。
Django 从一开始就带有一个称为 Message 消息框架的功能。
Message 配置
settings.py 中默认进行配置。 INSTALLED_APPS = [ ...... "django.contrib.messages", ...... ]应用调试
views.py 添加消息,直接使用message的add_messages方法 from django.contrib import messages add_message(request, level, message, extra_tags="", fail_silently=False) # 不启用消息fail_silent =True messages.add_message(request, messages.INFO, "Hello") # 快捷方式添加 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.")
前端调用 *.html {% if messages %}
{% for message in messages %} - {{ message }}
{% endfor %}
{% endif %}
Message 参数说明MESSAGE_LEVEL
设置可以用来改变记录的最小级别,小于这个级别的消息将被忽略 Leve1 : DEBUG 将在生产部署中忽略(或删除)的与开发相关的消息 Leve2 : INFO 普通提示信息 Leve3 : SUCCESS 成功信息 Leve4 : WARNING 警告信息 Leve5 : ERROR 已经发生的错误信息 MESSAGE_LEVEL = messages.INFO
views.py 内置方法可以直接导入 from django.contrib.messages import constants as message_constants MESSAGE_LEVEL = message_constants.DEBUGMESSAGE_STORAGEMESSAGE_STORAGE = "django.contrib.messages.storage.fallback.FallbackStorage"
Django 提供了三种内置的消息存储后端:
存储请求会话中的所有消息。 MESSAGE_STORAGE = "django.contrib.messages.storage.session.SessionStorage",
该类将消息数据存储在cookie中(使用秘密散列签名以防止操作),以便在请求之间持久化通知。如果cookie数据大小超过2048字节,则删除旧消息。 MESSAGE_STORAGE = "django.contrib.messages.storage.cookie.CookieStorage",
首先使用 CookieStorage,然后返回到使用 SessionStorage 来存储不能放入单个cookie的消息,还需要Django的contrib.sessions的应用程序。 MESSAGE_STORAGE = "django.contrib.messages.storage.fallback.FallbackStorage",MESSAGE_TAGS
这将消息级别映射到消息标记,该标记通常在HTML中呈现为CSS类。 MESSAGE_TAGS = { # 级别:样式 messages.DEBUG: "debug", # 级别:10 将在生产部署中忽略(或删除)的与开发相关的消息 messages.INFO: "info", # 级别:20 普通提示信息 messages.SUCCESS: "success", # 级别:25成功信息 messages.WARNING: "warning", # 级别:30警告信息 messages.ERROR: "error", # 级别:40 已经发生的错误信息 } from django.contrib.messages import constants as message_constants MESSAGE_TAGS = {message_constants.INFO: ""}
views.py 创建自定义消息级别。 from django.contrib.messages import constants as messages MESSAGE_TAGS = { messages.INFO: "", 50: "critical", # 自定义级别:样式 }常用项目配置
settings.py 项目配置 INSTALLED_APPS = [ ...... "django.contrib.messages", ] MIDDLEWARE = [ ...... "django.contrib.sessions.middleware.SessionMiddleware", # 必须启用 ] 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.media", ], "libraries": "staticfiles": "django.templatetags.static", } }, }, ]
views.py get_messages(request) 获取请求消息。 from django.contrib.messages import get_messages storage = get_messages(request) for message in storage: do_something_with_the_message(message) # 自定义消息级别 # 在MESSAGE_TAGS中的级别不可冲突 CRITICAL = 50 def my_view(request): messages.add_message(request, CRITICAL, "发生严重错误。") # 设置最小级别 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) # 获取消息级别 from django.contrib import messages current_level = messages.get_level(request) # 添加额外的消息标签 messages.add_message(request, messages.INFO, "Over 9000!", extra_tags="dragonball") messages.error(request, "Email box full", extra_tags="email")
前端调用 *.html {% if messages %} {% for message in messages %} {% if message.level == DEFAULT_MESSAGE_LEVELS.INFO %}
【信息】:{{ message }} {% endif %} {% if message.level == DEFAULT_MESSAGE_LEVELS.SUCCESS %}
【成功】:{{ message }} {% endif %} {% if message.level == DEFAULT_MESSAGE_LEVELS.WARNING %}
【警告】:{{ message }} {% endif %} {% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}
【错误】:{{ message }} {% endif %} {% endfor %} {% endif %}