一.簡介 在網頁應用中,你經常需要在處理完表單或其它類型的用戶輸入後,顯示一個通知消息(也叫做“flash message”)給用戶 對於這個功能,Django 提供基於Cookie 和會話的消息,無論是匿名用戶還是認證的用戶。 其消息框架允許你臨時將消息存儲在請求中,併在接下來的請求(通常就是下一 ...
一.簡介
在網頁應用中,你經常需要在處理完表單或其它類型的用戶輸入後,顯示一個通知消息(也叫做“flash message”)給用戶
對於這個功能,Django 提供基於Cookie 和會話的消息,無論是匿名用戶還是認證的用戶。
其消息框架允許你臨時將消息存儲在請求中,併在接下來的請求(通常就是下一個請求)中提取它們並顯示。每個消息都帶有一個特定level 標簽,表示其優先順序(例如info、warning 或error)
二.啟用消息框架
消息框架的實現通過一個中間件 類和對應的context processor。
django-admin startproject 創建的預設settings.py 已經包含啟用消息框架功能需要的所有的設置:
-
INSTALLED_APPS 中的'django.contrib.messages'。
-
MIDDLEWARE_CLASSES 中的'django.contrib.sessions.middleware.SessionMiddleware' 和'django.contrib.messages.middleware.MessageMiddleware'。
預設的後端存儲 依賴sessions。所以MIDDLEWARE_CLASSES 中必須啟用SessionMiddleware 並出現在MessageMiddleware 之前。
-
TEMPLATES 設置中定義的DjangoTemplates 的'context_processors' 選項包含'django.contrib.messages.context_processors.messages'。
如果你不想使用消息框架,你可以刪除INSTALLED_APPS 中的 'django.contrib.messages'、MIDDLEWARE_CLASSES 中的MessageMiddleware 和TEMPLATES 中的messages context processo
2.1 配置消息框架引擎
消息框架可以使用不同的後臺存儲臨時消息。
Django 在django.contrib.messages 中提供三個內建的存儲類:
-
這個類存儲消息數據於與Cookie 中(已經用一個安全的哈希進行簽名以防止篡改)以在請求之間傳遞消息。如果Cookie 數據的大小將超過2048 位元組,將丟棄舊的消息。
- class storage.fallback.FallbackStorage
-
這個類首先使用CookieStorage,如果消息塞不進一個Cookie 中則使用SessionStorage。 它同樣要求啟用Django 的contrib.sessions 應用。
這個行為避免每次都寫會話。在通常情況下,它提供的性能應該是最好的。
FallbackStorage 是預設的存儲類。如果它不適合你的需要,你可以通過設置 MESSAGE_STORAGE 為它的完整導入路徑選擇另外一個存儲類,例如:
MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'
3.3 消息級別
消息框架的級別是可配置的,與Python logging 模塊類似。消息的級別可以讓你根據類型進行分組,這樣它們能夠在不同的視圖和模板中過濾或顯示出來
django.contrib.messages 導入的內建級別有:
Constant | Purpose |
---|---|
DEBUG | Development-related messages that will be ignored (or removed) in a production deployment |
INFO | Informational messages for the user |
SUCCESS | An action was successful, e.g. “Your profile was updated successfully” |
WARNING | A failure did not occur but may be imminent |
ERROR | An action was not successful or some other failure occurred |
MESSAGE_LEVEL 設置可以用來改變記錄的最小級別(它還可以在每個請求中修改)。小於這個級別的消息將被忽略。
若要修改消息級別的預設標簽,設置MESSAGE_TAGS為包含你想要修改的級別的字典
from django.contrib.messages import constants as messages MESSAGE_TAGS = { messages.INFO: '', 50: 'critical', }
3.3 在視圖及模板中使用
add_message(request, level, message, extra_tags='', fail_silently=False)
例
新增消息
from django.contrib import messages messages.add_message(request, messages.INFO, 'Hello world.')
有幾個快捷方法提供標準的方式來新增消息並帶有常見的標簽(這些標簽通常表示消息的HTML 類型)
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.')
3.4 顯示消息
get_messages(request)
在你的模板中,像下麵這樣使用:
{% if messages %} <ul class="messages"> {% for message in messages %} <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> {% endfor %} </ul> {% endif %}
三.配置使用
以上只是簡單舉例使用,看更詳細文檔請參考 https://docs.djangoproject.com/en/1.10/ref/contrib/messages/
在生產使用中我們可以把它整合成一個模塊便於調用,結合前端顯示當有錯誤或者其它信息時瀏覽器可以alert消息
例
from django.contrib.messages import constants as message_constants MESSAGE_LEVEL = message_constants.INFO 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', ], }, }, ]settings
#!/usr/bin/env python # -*- coding: utf-8 -*- from django.contrib import messages def flash(request, title, text, level='info'): """ 利用django的message系統發送一個信息。 """ level_map = { 'info': messages.INFO, 'debug': messages.DEBUG, 'success': messages.SUCCESS, 'warning': messages.WARNING, 'error': messages.ERROR } level = level_map[level] messages.add_message(request, level, text, extra_tags=title) return 'ok'message method
{% if messages %} <script> {% for msg in messages %} alert('{{ msg.message }}'); {% endfor %} </script> {% endif %}前端顯示
VIEWS調用
result = XXXXX if result: flash(request,"success", "成功!") else: flash(request,"error", "。。。。")