django 消息框架 message使用詳解
前言
在網(wǎng)頁(yè)應(yīng)用中,我們經(jīng)常需要在處理完表單或其它類型的用戶輸入后,顯示一個(gè)通知信息給用戶。
對(duì)于這個(gè)需求,Django提供了基于Cookie或者會(huì)話的消息框架messages,無(wú)論是匿名用戶還是認(rèn)證的用戶。這個(gè)消息框架允許你臨時(shí)將消息存儲(chǔ)在請(qǐng)求中,并在接下來(lái)的請(qǐng)求(通常就是下一個(gè)請(qǐng)求)中提取它們并顯示。每個(gè)消息都帶有一個(gè)特定的level標(biāo)簽,表示其優(yōu)先級(jí)(例如info、 warning或error)。
一、啟用消息框架
Django的messages消息框架的實(shí)現(xiàn),依賴messages中間件和對(duì)應(yīng)的context processor。
通過django-admin startproject xxx命令創(chuàng)建工程時(shí),已經(jīng)默認(rèn)在settings.py中開啟了消息框架功能需要的所有的設(shè)置:
- INSTALLED_APPS中注冊(cè)的'django.contrib.messages'。
- MIDDLEWARE中添加'django.contrib.sessions.middleware.SessionMiddleware'和'django.contrib.messages.middleware.MessageMiddleware'。Django的messages框架默認(rèn)使用的存儲(chǔ)后端為sessions。所以Session中間件必須被啟用,并出現(xiàn)在Message中間件之前。
- TEMPLATES設(shè)置中的DjangoTemplates選項(xiàng)包含的'context_processors'配置項(xiàng)要包含'django.contrib.messages.context_processors.messages'。
二、配置消息引擎
通常我們使用默認(rèn)的就好,可以跳過這節(jié),但如果真有需要,也可以配置:
1. 存儲(chǔ)后端
Django提供了三種內(nèi)置的消息存儲(chǔ)后端:
class storage.session.SessionStorage class storage.cookie.CookieStorage class storage.fallback.FallbackStorage
FallbackStorage是默認(rèn)的存儲(chǔ)后端。如果它不適合你的需要,你可以通過設(shè)置MESSAGE_STORAGE選擇另外一個(gè)存儲(chǔ)后端,例如:
MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'
2. 消息級(jí)別
消息框架的級(jí)別是可配置的,與Python的logging模塊類似
Django內(nèi)置的message級(jí)別有下面幾種:
| 級(jí)別 | 說(shuō)明 |
|---|---|
| DEBUG | 將在生產(chǎn)部署中忽略(或刪除)的與開發(fā)相關(guān)的消息 |
| INFO | 普通提示信息 |
| SUCCESS | 成功信息 |
| WARNING | 警告信息 |
| ERROR | 已經(jīng)發(fā)生的錯(cuò)誤信息 |
3. 消息樣式
通常,我們?cè)谇岸薍TML頁(yè)面中,希望給不同級(jí)別的消息,增加不同的CSS樣式,比如警告為黃色,error為紅色等等。
Django為我們提供了一個(gè)默認(rèn)的樣式對(duì)應(yīng)關(guān)系:
| 級(jí)別 | 樣式 |
|---|---|
| DEBUG | debug |
| INFO | info |
| SUCCESS | success |
| WARNING | warning |
| ERROR | error |
也就是說(shuō)SUCCESS級(jí)別的消息,在前端會(huì)被賦予一個(gè)success樣式class。
若要修改消息級(jí)別的默認(rèn)樣式,設(shè)置MESSAGE_TAGS,按如下例子所示:。
from django.contrib.messages import constants as messages
MESSAGE_TAGS = {
messages.INFO: '',
50: 'critical',
}
三、使用消息框架
1. 添加消息
方法原型:add_message(request, level, message, extra_tags='', fail_silently=False)[source]
新增一條消息:
from django.contrib import messages messages.add_message(request, messages.INFO, 'Hello world.')
提供請(qǐng)求對(duì)象request(直接用就行),消息級(jí)別、消息內(nèi)容字符串三個(gè)參數(shù)即可。
或者使用下面的快捷方式
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 %}
相關(guān)說(shuō)明:
- 通過if判斷是否有消息;
- messages是一個(gè)列表,必須用for標(biāo)簽循環(huán)它;
- 即使你知道只有一條消息,也要迭代messages列表,否則下個(gè)請(qǐng)求中,上個(gè)請(qǐng)求的消息不會(huì)被清除。
- 可以通過message.tags拿到每個(gè)消息的CSS樣式
有一個(gè)DEFAULT_MESSAGE_LEVELS變量,它映射消息級(jí)別的名稱到它們的數(shù)值:
{% 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 %}
說(shuō)明:
- 可以通過message.level拿到當(dāng)前消息的級(jí)別數(shù)值;
- 將它與DEFAULT_MESSAGE_LEVELS.ERROR進(jìn)行對(duì)比;
- 如果一樣,就說(shuō)明當(dāng)前消息級(jí)別為ERROR,需要顯示到頁(yè)面上。
在模板的外面,比如視圖中,可以使用get_messages()方法獲取消息:
from django.contrib.messages import get_messages storage = get_messages(request) for message in storage: do_something_with_the_message(message)
說(shuō)明:
- get_messages()返回的是存儲(chǔ)后端的一個(gè)實(shí)例。
- 循環(huán)這個(gè)實(shí)例,可以獲得每條消息
對(duì)于每一個(gè)消息實(shí)例,都包含下面的屬性,可以在模版或視圖中調(diào)用:
- message: 消息的實(shí)際內(nèi)容文本。不要使用message.message,直接message。
- level: 消息級(jí)別,一個(gè)整數(shù)。
- tags: 一個(gè)字符串,由該消息的所有標(biāo)簽(extra_tags和tags)組合而成,組合時(shí)用空格分割開這些標(biāo)簽。
- extra_tags: 一個(gè)字符串,由該消息的定制標(biāo)簽組合而成,并用空格分割。默認(rèn)為空。
- level_tag: 當(dāng)前消息級(jí)別對(duì)應(yīng)的CSS字符串,前面介紹過。
3. 自定義消息級(jí)別
消息級(jí)別只是一個(gè)整數(shù)常量,所以,可以定義自己的級(jí)別常量,例如:
CRITICAL = 50 def my_view(request): messages.add_message(request, CRITICAL, 'A serious error occurred.')
在自定義消息級(jí)別時(shí),應(yīng)小心避免覆蓋現(xiàn)有級(jí)別。內(nèi)置級(jí)別的值為:
| 級(jí)別 | 對(duì)應(yīng)整數(shù)值 |
|---|---|
| DEBUG | 10 |
| INFO | 20 |
| SUCCESS | 25 |
| WARNING | 30 |
| ERROR | 40 |
如果你需要在HTML或CSS中使用自定義級(jí)別,則需要通過MESSAGE_TAGS設(shè)置提供相應(yīng)的映射關(guān)系。
4. 自定義每個(gè)請(qǐng)求的最小記錄級(jí)別
每個(gè)請(qǐng)求都可以通過set_level()方法設(shè)置最小記錄級(jí)別,如下所示:
from django.contrib import messages # 修改最小級(jí)別為DEBUG messages.set_level(request, messages.DEBUG) messages.debug(request, 'Test message...') # 在另外一個(gè)視圖中修改最小級(jí)別為WARNING messages.set_level(request, messages.WARNING) messages.success(request, 'Your profile was updated.') # 被忽略,不記錄 messages.warning(request, 'Your account is about to expire.') # 記錄 # 將最小級(jí)別恢復(fù)到默認(rèn)值 messages.set_level(request, None) set_level()方法接收request為第一參數(shù),消息級(jí)別為第二參數(shù)。
類似的,當(dāng)前有效的記錄級(jí)別可以用get_level()方法獲取:
from django.contrib import messages current_level = messages.get_level(request)
5. 添加額外的消息CSS樣式
要添加自定義的消息CSS樣式,可以通過extra_tags參數(shù):
messages.add_message(request, messages.INFO, 'Over 9000!', extra_tags='dragonball') messages.error(request, 'Email box full', extra_tags='email')
四、消息過期機(jī)制
默認(rèn)情況下,如果包含消息的迭代器完成迭代后,當(dāng)前請(qǐng)求中的消息都將被刪除。
如果你不想這么做,想保留這些消息,那么需要顯式的指定used參數(shù)為False,如下所示:
storage = messages.get_messages(request) for message in storage: do_something_with(message) storage.used = False
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python bluetooth藍(lán)牙信息獲取藍(lán)牙設(shè)備類型的方法
這篇文章主要介紹了python bluetooth藍(lán)牙信息獲取藍(lán)牙設(shè)備類型的方法,具體轉(zhuǎn)化方法文中給大家介紹的非常詳細(xì),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
利用pyinstaller或virtualenv將python程序打包詳解
這篇文章主要給大家介紹了利用pyinstaller將python程序打包的相關(guān)資料,文中介紹的非常詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-03-03
PyTorch一小時(shí)掌握之a(chǎn)utograd機(jī)制篇
這篇文章主要介紹了PyTorch一小時(shí)掌握之a(chǎn)utograd機(jī)制篇,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
python基于win32實(shí)現(xiàn)窗口截圖
這篇文章主要為大家詳細(xì)介紹了python基于win32api實(shí)現(xiàn)窗口截圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03
Python 把兩層列表展開平鋪成一層(5種實(shí)現(xiàn)方式)
這篇文章主要介紹了Python 把兩層列表展開平鋪成一層(5種實(shí)現(xiàn)方式),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2021-04-04

