源碼分析Django的message組件
Django的Message組件(源碼分析)
1. 配置
# MESSAGE_STORAGE = 'django.contrib.messages.storage.fallback.FallbackStorage' # MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage' MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
INSTALLED_APPS = [
# 'django.contrib.admin',
# 'django.contrib.auth',
# 'django.contrib.contenttypes',
# 'django.contrib.sessions',
'django.contrib.messages', # 配置
'django.contrib.staticfiles',
"web.apps.WebConfig"
]MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
# 'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware', # 中間件
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'utils.md.AuthMiddleware'
]TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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',
],
},
},
]2. 設置值
from django.contrib import messages messages.add_message(reqeust, messages.SUCCESS, "刪除成功1") messages.add_message(reqeust, messages.ERROR, "操作失敗")
3. 讀取值
- 第一種: 視圖中讀取
from django.contrib.messages.api import get_messages
messages = get_messages(request)
for msg in messages:
print(msg)- 第二種: 模版中讀取
<ul>
{% for message in messages %}
<li>{{ message.tags }} {{ message }}</li>
{% endfor %}
</ul>4. 源碼分析
4.1第一步: 設置值
from django.contrib import messages messages.add_message(reqeust, messages.SUCCESS, "刪除成功1")
我們根據(jù)django的生命周期, 從Middleware入手,
- process_request: 將SessionStorage對象封裝到request的_message(咱們的案例里面也有將用戶信息封裝到request中, 這樣在中間件中添加方便后期調用)
- process_response: 將message對象反序列化后儲存到session/Cookie中

4.2 第二步: 讀取值
- process_request: 通過循環(huán)讀取message內容
- process_response: 從session中刪除message值

【設置】中間件process_request加載
【設置】在視圖函數(shù)中往message中寫入值(內存)
【設置】中間件process_response,將內存中新增的數(shù)據(jù)寫入到數(shù)據(jù)源
【新頁面】中間件process_request加載
【新頁面】在視圖函數(shù)或模板中讀取message中的信息(老的數(shù)據(jù)源加載的+新增的)
- 【設置】中間件process_response
used = True,則只保存新增部分。 added_new = True,老的數(shù)據(jù)源加載的+新增的都重新保存到數(shù)據(jù)源。
到此這篇關于源碼分析Django的message組件的文章就介紹到這了,更多相關Django message組件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
js實現(xiàn)做通訊錄的索引滑動顯示效果和滑動顯示錨點效果
下面小編就為大家?guī)硪黄猨s實現(xiàn)做通訊錄的索引滑動顯示效果和滑動顯示錨點效果。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02
web性能優(yōu)化之javascript性能調優(yōu)
本文詳細介紹Web 開發(fā)中關于性能方面需要注意的一些小細節(jié),從 JavaScript 本身著手,介紹了 JavaScript 中需要避免的一些函數(shù)的使用和編程規(guī)則,比如 eval 的弊端,function scope chain 以及 String 的用法等等2012-12-12
javascript面向對象之共享成員屬性與方法及prototype關鍵字用法
這篇文章主要介紹了javascript面向對象之共享成員屬性與方法及prototype關鍵字用法,實例分析了prototype關鍵字在共享成員屬性與方法中的原理與使用技巧,需要的朋友可以參考下2015-01-01

