官方文件
requestcontext是context的子類,跟context有一些區別
requestcontext強迫第乙個引數是
request
,第二個是乙個構造
context
物件用的字典,第三個是可選的,是乙個自定義的
context processer(
上下文處理器)
requestcontext總是會載入預設的
context processer
context processer是這樣的一種處理器,他會接收
request
作為引數,並且根據
request(
比如request
中的.meta值)
來新增額外的
context
字典到requestcontext
中,與在
requestcontext
中原來的字典結構構成新的
context
傳遞給模板
context processer在配置
settings.py
檔案的template_context_processors中,一般預設有下面幾個:
("django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.core.context_processors.tz",
"django.contrib.messages.context_processors.messages")
首先,requestcontext會使用你傳入的字典結構構造乙個
context
,之後,上面的處理器順序載入,每乙個處理完後,傳遞給下乙個處理器(就是新增響應的鍵值對到context結構中),下乙個處理器又再處理,所以小心,你手動傳入到context中的字典鍵名不應該與處理器中傳入的的鍵名一樣,否則會在處理器中被覆蓋掉。
並且,requestcontext
總是使用 django.core.context_processors.csrf這個處理器,是生成乙個安全的令牌(token),防止
csrf
攻擊。
你自定義的contextprocessor
是作為第三個引數傳入給
requestcontext
,如(例子來自官方文件)
上述自定義的處理器新增了乙個客戶端位址,然後requestcontext
就包含了
ip_address:******xx這樣的字典結構,當然,是從
request
拿的,這就是為什麼
requestcontext
結構要接受
request
引數的原因了,因為後續的
contextprocessor
也會根據本身的功能充
request
充拿出鍵值對,新增到
context
結構,反饋給模板。
例如:django.contrib.auth.context_processors.auth會加添兩個鍵值對給context
user,乙個
auth.user
的例項,代表當前登入的使用者,若沒有登入,為乙個 anonymoususer,乙個匿名使用者例項
django.contrib.auth.context_processors.request能使得我們可以在模板中可以直接使用request物件
編寫自己的contextprocessor
很簡單了,是乙個函式,接受乙個
request
,並且返回乙個字典。這個字典是用來插入
context
結構的
你可以自己匯入,或者在template_context_processors中新增,注意,template_context_processors是順序載入的
django學習記錄
django的處理流程 當使用者發出http請求,urlhandler接收使用者請求,根據開發人員設定的路由規則匹配相應的處理類 根據請求的型別判斷呼叫的http方法 如果需要連線資料庫,views中的函式將會呼叫models的方法,否則直接去template中取出html頁面直接返回 呼叫mode...
Django學習記錄(三)
postgresql 的配置 安裝postgresql在前面已經有了,再安裝和python的界麵包psycopg2,也在前面寫了 psql postgresql 8.4.18 我操作如下 service postgresql initdb service postgresql start su po...
Django學習記錄(一)
今天嘗試了一下python的django框架 在windows平台下 python 3.6 django 2.1 過程如下 1 安裝python和django環境,不再累述,網上一大堆。2 安裝完畢後,建立django工程,使用命令 django admin.exe startproject pro...