溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在django中使用message消息框架

發(fā)布時(shí)間:2021-03-24 16:18:13 來(lái)源:億速云 閱讀:579 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

本篇文章為大家展示了如何在django中使用message消息框架,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

一、啟用消息框架

Django的messages消息框架的實(shí)現(xiàn),依賴messages中間件和對(duì)應(yīng)的context processor。

通過(guò)django-admin startproject xxx命令創(chuàng)建工程時(shí),已經(jīng)默認(rèn)在settings.py中開(kāi)啟了消息框架功能需要的所有的設(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)的就好,可以跳過(guò)這節(jié),但如果真有需要,也可以配置:

1. 存儲(chǔ)后端

Django提供了三種內(nèi)置的消息存儲(chǔ)后端:

class storage.session.SessionStorage class storage.cookie.CookieStorage class storage.fallback.FallbackStorage

FallbackStorage是默認(rèn)的存儲(chǔ)后端。如果它不適合你的需要,你可以通過(guò)設(shè)置MESSAGE_STORAGE選擇另外一個(gè)存儲(chǔ)后端,例如:

MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'

2. 消息級(jí)別

消息框架的級(jí)別是可配置的,與Python的logging模塊類(lèi)似

Django內(nèi)置的message級(jí)別有下面幾種:

級(jí)別說(shuō)明
DEBUG將在生產(chǎn)部署中忽略(或刪除)的與開(kāi)發(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í)別樣式
DEBUGdebug
INFOinfo
SUCCESSsuccess
WARNINGwarning
ERRORerror

也就是說(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ō)明:

  • 通過(guò)if判斷是否有消息;

  • messages是一個(gè)列表,必須用for標(biāo)簽循環(huán)它;

  • 即使你知道只有一條消息,也要迭代messages列表,否則下個(gè)請(qǐng)求中,上個(gè)請(qǐng)求的消息不會(huì)被清除。

  • 可以通過(guò)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ō)明:

  • 可以通過(guò)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í)用空格分割開(kāi)這些標(biāo)簽。

  • extra_tags: 一個(gè)字符串,由該消息的定制標(biāo)簽組合而成,并用空格分割。默認(rèn)為空。

  • level_tag: 當(dāng)前消息級(jí)別對(duì)應(yīng)的CSS字符串,前面介紹過(guò)。

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ù)值
DEBUG10
INFO20
SUCCESS25
WARNING30
ERROR40

如果你需要在HTML或CSS中使用自定義級(jí)別,則需要通過(guò)MESSAGE_TAGS設(shè)置提供相應(yīng)的映射關(guān)系。

4. 自定義每個(gè)請(qǐng)求的最小記錄級(jí)別

每個(gè)請(qǐng)求都可以通過(guò)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ù)。

類(lèi)似的,當(dāng)前有效的記錄級(jí)別可以用get_level()方法獲取:

from django.contrib import messages
current_level = messages.get_level(request)

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

要添加自定義的消息CSS樣式,可以通過(guò)extra_tags參數(shù):

messages.add_message(request, messages.INFO, 'Over 9000!', extra_tags='dragonball')
messages.error(request, 'Email box full', extra_tags='email')

四、消息過(guò)期機(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

上述內(nèi)容就是如何在django中使用message消息框架,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI