1. 程式人生 > >Django進階 messages框架

Django進階 messages框架

star djang 顯示 als pre add web 應用 cut tor

在 web 應用程序中,通常需要在處理表單或其他類型的用戶輸入之後,向用戶顯示一個通知消息(也稱為 flash message)。對於這個功能,Django 提供基於 Cookie 和會話的消息,無論是匿名用戶還是認證的用戶。消息框架允許臨時將消息存儲在請求中,並在下一個請求中提取它們並顯示。每個消息都帶有一個特定 level 標簽,表示其優先級。

啟用消息框架

消息框架的實現通過一個中間件類和對應的上下文處理器。django-admin startproject 命令創建的默認 settings.py 已經包含啟用消息框架功能需要的所有的設置:

INSTALLED_APPS

  • django.contrib.messages

MIDDLEWARE

  • django.contrib.sessions.middleware.SessionMiddleware
  • django.contrib.messages.middleware.MessageMiddleware

默認的後端存儲依賴 sessions。所以中間件中必須啟用 SessionMiddleware 並出現在 MessageMiddleware 之前。

TEMPLATES

  • context_processors 選項包含 django.contrib.messages.context_processors.messages

配置消息引擎

1. 存儲後端

消息框架可以使用不同的後端存儲臨時消息。

Django 在 django.contrib.messages 中提供了三個內置的存儲類:

(1)class storage.session.SessionStorage

該類存儲請求會話中的所有消息。因此它需要啟用 django.contrib.sessions 應用。

(2)class storage.cookie.CookieStorage

該類將消息數據存儲在 cookie 中,以便在請求之間持久化通知。如果 cookie 數據大小超過 2048 字節,則刪除舊消息。

(3)class storage.fallback.FallbackStorage

FallbackStorage 是默認的存儲類。這個類首先使用 CookieStorage,然後使用 SessionStorage 來存儲不能放入單個 cookie 的消息。

這種行為盡量避免向會話寫入內容。在一般情況下提供最好的性能。

2. 消息等級

消息框架可配置消息級別。消息級別按類型對消息進行分組,以便在視圖和模板中以不同的方式過濾或顯示消息。

django.contrib.messages 內置消息級別:DEBUG,INFO,SUCCESS,WARNING,ERROR。

MESSAGE_LEVEL 設置可以用來改變記錄的最小級別(還可以在每個請求中修改),小於這個級別的消息將被忽略。

消息標簽

消息標簽是消息級別的字符串表示形式,加上直接在視圖中添加的任何額外標記。標記存儲在字符串中,並由空格分隔。通常,消息標記被用作 CSS 類,以根據消息類型定制消息樣式。

默認情況下,每個消息級別都有一個消息標簽(messages.tags):debug,info,success,warning,error。

Constant Level Tag Purpose
DEBUG 10 debug 與開發相關的消息
INFO 20 info 為用戶提供的消息
SUCCESS 25 success 操作成功的消息
WARNING 30 warning 未失敗的告警消息
ERROR 40 error 操作失敗的消息

在視圖和模板中使用消息

添加消息

要添加消息,使用 message.add_message() 方法:

1 from django.contrib import messages
2 
3 messages.add_message(request, level, message, extra_tags=‘‘, fail_silently=False)

一些快捷方式提供了一種標準的方式來添加帶有常用標記的消息(通常表示為消息的HTML類):

1 messages.debug(request, %s SQL statements were executed. % count)
2 messages.info(request, Three credits remain in your account.)
3 messages.success(request, Profile details updated.)
4 messages.warning(request, Your account expires in three days.)
5 messages.error(request, Document deleted.)

顯示消息

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

即使只有一條消息,仍然應該遍歷消息序列,否則消息存儲將不會為下一個請求清除。

Django進階 messages框架