python 訊息框架 訊息框架message

2021-10-13 04:36:38 字數 4322 閱讀 3898

在網頁應用中,我們經常需要在處理完表單或其它型別的使用者輸入後,顯示乙個通知資訊給使用者。

對於這個需求,django提供了基於cookie或者會話的訊息框架messages,無論是匿名使用者還是認證的使用者。這個訊息框架允許你臨時將訊息儲存在請求中,並在接下來的請求(通常就是下乙個請求)中提取它們並顯示。每個訊息都帶有乙個特定的level標籤,表示其優先順序(例如info、

warning或error)。

一、啟用訊息框架

django的messages訊息框架的實現,依賴messages中介軟體和對應的context processor。

通過django-admin startproject ***命令建立工程時,已經預設在settings.py中開啟了訊息框架功能需要的所有的設定:

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'。

二、配置訊息引擎

通常我們使用預設的就好,可以跳過這節,但如果真有需要,也可以配置:

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 messages

message_tags = }

通過if判斷是否有訊息;

messages是乙個列表,必須用for標籤迴圈它;

即使你知道只有一條訊息,也要迭代messages列表,否則下個請求中,上個請求的訊息不會被清除。

可以通過message.tags拿到每個訊息的css樣式

有乙個default_message_levels變數,它對映訊息級別的名稱到它們的數值:

important:

}說明:

可以通過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

info

success

warning

error

如果你需要在html或css中使用自定義級別,則需要通過message_tags設定提供相應的對映關係。

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

每個請求都可以通過set_level()方法設定最小記錄級別,如下所示:

from django.contrib import messages

# 修改最小級別為debug

messages.set_level(request, messages.debug)

messages.debug(request, 'test message...')

# 在另外乙個檢視中修改最小級別為warning

messages.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 messages

current_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')

四、訊息過期機制

預設情況下,如果包含訊息的迭代器完成迭代後,當前請求中的訊息都將被刪除。

如果你不想這麼做,想保留這些訊息,那麼需要顯式的指定used引數為false,如下所示:

storage = messages.get_messages(request)

for message in storage:

do_something_with(message)

storage.used = false

簡單訊息框架

using system using system.collections.generic using system.text namespace 訊息框架 const uint maxpriority 15 const int leftoff 24 dictionaryeventtable new...

編織訊息框架 訊息處理模式 管道模式

proxy server 提供外部公開訪問服務 client向proxy server訪問時,proxy server分發n個任務呼叫工作服 而client無需要關心proxy server 如何工作,如服務排程非同步還是同步 等侍合併結果 資料過濾去髒等 常用於 公開訪問服務,如資料分析任務分發 ...

FF ASIO 非同步訊息網路框架

我提到,針對前面使用boost asio 中遇到的問題,對asio進行封裝,如下幾個目標 1.建立socket acceptor不再自己構造io service,由於asio中的物件均要儲存io service的引用,若要手動構造,必須保證io service晚於所有的asio物件 如socket ...