Django進階 messages框架
在 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框架