消息框架 message

在網頁應用中,咱們常常須要在處理完表單或其它類型的用戶輸入後,顯示一個通知信息給用戶。
對於這個需求,Django提供了基於Cookie或者會話的消息框架messages,不管是匿名用戶仍是認證的用戶。這個消息框架容許你臨時將消息存儲在請求中,並在接下來的請求(一般就是下一個請求)中提取它們並顯示。每一個消息都帶有一個特定的level標籤,表示其優先級(例如info、 warning或error)。

1、啓用消息框架

Django的messages消息框架的實現,依賴messages中間件和對應的context processor。
經過django-admin startproject xxx命令建立工程時,已經默認在settings.py中開啓了消息框架功能須要的全部的設置:
  • INSTALLED_APPS中註冊的'django.contrib.messages'。
  • MIDDLEWARE中添加'django.contrib.sessions.middleware.SessionMiddleware'和'django.contrib.messages.middleware.MessageMiddleware'。Django的messages框架默認使用的存儲後端爲sessions。因此Session中間件必須被啓用,並出如今Message中間件以前。
  • TEMPLATES設置中的DjangoTemplates選項包含的'context_processors'配置項要包含'django.contrib.messages.context_processors.messages'。

2、配置消息引擎

一般咱們使用默認的就好,能夠跳過這節,但若是真有須要,也能夠配置:

1. 存儲後端

Django提供了三種內置的消息存儲後端:
class storage.session.SessionStorage class storage.cookie.CookieStorage class storage.fallback.FallbackStorage
FallbackStorage是默認的存儲後端。若是它不適合你的須要,你能夠經過設置MESSAGE_STORAGE選擇另一個存儲後端,例如:
MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'

2. 消息級別

消息框架的級別是可配置的,與Python的logging模塊相似
Django內置的message級別有下面幾種:
級別
說明
DEBUG
將在生產部署中忽略(或刪除)的與開發相關的消息
INFO
普通提示信息
SUCCESS
成功信息
WARNING
警告信息
ERROR
已經發生的錯誤信息
MESSAGE_LEVEL設置能夠用來改變記錄的最小級別(參考前面的Django設置章節),小於這個級別的消息將被忽略。

3. 消息樣式

一般,咱們在前端HTML頁面中,但願給不一樣級別的消息,增長不一樣的CSS樣式,好比警告爲黃色,error爲紅色等等。
Django爲咱們提供了一個默認的樣式對應關係:
級別
樣式
DEBUG
debug
INFO
info
SUCCESS
success
WARNING
warning
ERROR
error
也就是說SUCCESS級別的消息,在前端會被賦予一個success樣式class。
若要修改消息級別的默認樣式,設置MESSAGE_TAGS,按以下例子所示:。
from django.contrib.messages import constants as messagesMESSAGE_TAGS = {
messages.INFO: '',
50: 'critical',}

3、使用消息框架

1. 添加消息

方法原型:add_message(request, level, message, extra_tags='', fail_silently=False)[source]
新增一條消息:
from django.contrib import messagesmessages.add_message(request, messages.INFO, 'Hello world.')
提供請求對象request(直接用就行),消息級別、消息內容字符串三個參數便可。
或者使用下面的快捷方式
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.')

2. 顯示消息

方法原型:get_messages(request)[source]
在你的模板文件中,像下面這樣使用:
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
相關說明:
  • 經過if判斷是否有消息;
  • messages是一個列表,必須用for標籤循環它;
  • 即便你知道只有一條消息,也要迭代messages列表,不然下個請求中,上個請求的消息不會被清除。
  • 能夠經過message.tags拿到每一個消息的CSS樣式
有一個DEFAULT_MESSAGE_LEVELS變量,它映射消息級別的名稱到它們的數值:
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>
{% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}Important: {% endif %}
{{ message }}
</li>
{% endfor %}
</ul>
{% endif %}
說明:
  • 能夠經過message.level拿到當前消息的級別數值;
  • 將它與DEFAULT_MESSAGE_LEVELS.ERROR進行對比;
  • 若是同樣,就說明當前消息級別爲ERROR,須要顯示到頁面上。
在模板的外面,好比視圖中,可使用get_messages()方法獲取消息:
from django.contrib.messages import get_messages
 
storage = get_messages(request)for message in storage:
do_something_with_the_message(message)
說明:
  • get_messages()返回的是存儲後端的一個實例。
  • 循環這個實例,能夠得到每條消息
對於每個消息實例,都包含下面的屬性,能夠在模版或視圖中調用:
  • message: 消息的實際內容文本。不要使用message.message,直接message。
  • level: 消息級別,一個整數。
  • tags: 一個字符串,由該消息的全部標籤(extra_tags和tags)組合而成,組合時用空格分割開這些標籤。
  • extra_tags: 一個字符串,由該消息的定製標籤組合而成,並用空格分割。默認爲空。
  • level_tag: 當前消息級別對應的CSS字符串,前面介紹過。

3. 自定義消息級別

消息級別只是一個整數常量,因此,能夠定義本身的級別常量,例如:
CRITICAL = 50
 
def my_view(request):
messages.add_message(request, CRITICAL, 'A serious error occurred.')
在自定義消息級別時,應當心避免覆蓋現有級別。內置級別的值爲:
級別
對應整數值
DEBUG
10
INFO
20
SUCCESS
25
WARNING
30
ERROR
40
若是你須要在HTML或CSS中使用自定義級別,則須要經過MESSAGE_TAGS設置提供相應的映射關係。

4. 自定義每一個請求的最小記錄級別

每一個請求均可以經過set_level()方法設置最小記錄級別,以下所示:
from django.contrib import messages
 
# 修改最小級別爲DEBUGmessages.set_level(request, messages.DEBUG)messages.debug(request, 'Test message...')
 
# 在另一個視圖中修改最小級別爲WARNINGmessages.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)
set_level()方法接收request爲第一參數,消息級別爲第二參數。
相似的,當前有效的記錄級別能夠用get_level()方法獲取:
from django.contrib import messagescurrent_level = messages.get_level(request)

5. 添加額外的消息CSS樣式

要添加自定義的消息CSS樣式,能夠經過extra_tags參數:
messages.add_message(request, messages.INFO, 'Over 9000!', extra_tags='dragonball')
messages.error(request, 'Email box full', extra_tags='email')

4、消息過時機制

默認狀況下,若是包含消息的迭代器完成迭代後,當前請求中的消息都將被刪除。
若是你不想這麼作,想保留這些消息,那麼須要顯式的指定used參數爲False,以下所示:
storage = messages.get_messages(request)for message in storage:
do_something_with(message)storage.used = False
相關文章
相關標籤/搜索