一、背景關系處理器
背景關系處理器(一個函式)是用于在模板中定義一些常用的背景關系物件,在視圖執行完之后,如果視圖回傳的是HTML模板,那么就會自動執行背景關系處理器,并將執行結果(一個字典,就像render的context引數)作為模板的背景關系物件渲染到HTML模板中,
1. 自定義背景關系處理器
定義背景關系處理器其實就是定義一個普通的函式,需要注意:該函式的引數必須是request,回傳值必須是一個字典,最后把這個函式注冊到settings.py的TEMPLATES.OPTIONS.context_processors中就可以了,
在視圖執行完之后,如果視圖回傳的是HTML模板,那么就會去執行這個函式,并將回傳的字典作為背景關系應用到模板中,
# 引數必須是request
def front_user(request):
# 回傳值必須為字典
context = {}
# 可以給字典添加一些內容
# ....
return context
2. 內置背景關系處理器
在新建專案后,settings.py的TEMPLATES.OPTIONS.context_processors中會默認配置一些內置的背景關系處理器,這些處理器的詳細作用可以查看它的原始碼,有些處理器的原始碼其實并不復雜,使用的時候可以參考參考:
django.template.context_processors.debug:可以在模板中查看兩個變數的值,即debug和sql_queries,表示是否是處于DEBUG模式和執行過的資料庫查詢陳述句,但是要使用這兩個變數,還需要將本機的ip加入到settings.py中的INTERNAL_IPS(串列)中,django.template.context_processors.request:在模板中也可以直接使用視圖的request引數,django.contrib.auth.context_processors.auth:Django有一個內置的用戶系統,會在模板的背景關系中自動添加一個user物件,django.contrib.messages.context_processors.messages:在模板的背景關系中添加一個messages變數,使用示例如下:
from django.shortcuts import render
from django.contrib import messages
def message_view(request):
# 匯入messages后,直接使用以下兩種方法設定訊息內容即可
# 設定完成后在render中不用傳入,直接在模板中使用即可,如:{% for message in messages%}...{% endfor %}
messages.add_message(request, messages.INFO, '這是一個INFO級別的訊息!')
messages.DEBUG(request, '這是一個DEBUG級別的訊息!')
return render(request, 'message_view.html')
二、中間件
Django中的中間件其實就是一些在request和response處理程序中進行一些額外操作的插件,比如在視圖處理request之前或者response回傳給瀏覽器之前做一些額外的處理,
1. 自定義中間件
中間件的定義其實就是定義一個普通的裝飾器,然后將該裝飾器(中間件)注冊到settings.py的MIDDLEWARE串列中就可以了,根據裝飾器的原理可知,運行專案時,在專案啟動加載裝飾器時就會執行一部分代碼,這部分代碼在整個專案運行期間只會執行一次,然后每次在請求到達視圖之前以及在回應發送給瀏覽器之前也會執行一部分代碼,具體見示例,
函式形式中間件
# 其實就是定義一個裝飾器,函式及其引數根據裝飾器特性來定義即可
# 需要將定義的中間件函式加入到settings.py的MIDDLEWARE串列中
def front_user_middleware(get_response):
# 在專案啟動時執行一些初始化的代碼
def middleware(request):
# 每次視圖處理之前執行的一些處理
response = get_response(request)
# 每次response回傳給瀏覽器之前執行的一些處理
return response
return middleware
類形式中間件
# 也是一個裝飾器,不過是用類的形式來定義
class FrontUserMiddleware:
def __init__(self, get_response):
self.get_response = get_response
# 執行一些初始化的代碼
def __call__(self, request):
# 視圖處理之前執行的一些處理
response = self.get_response(request)
# response回傳給瀏覽器之前執行的一些處理
return response
2. 內置中間件
新建一個專案后,通常會自動配置一些中間件,另外也有一些沒有配置的內置中間件,如果需要用到,也可以添加進去,這些中間件的具體作用可以參考下原始碼:
django.middleware.security.SecurityMiddleware:安全處理中間件,比如XSS防御的請求頭或者將HTTP協議轉為HTTPS協議等,django.middleware.gzip.GZipMiddleware:如果回傳的回應的資料部分長度大于了200,那么會先將資料壓縮后再回傳給瀏覽器,注意這個中間件是沒有自動配置到Django專案中的, 手動配置時需要注意一下添加順序,可以放在SecurityMiddleware后,django.contrib.sessions.middleware.SessionMiddleware:session處理中間件,在request到達視圖之前給它添加一個處理好的session物件,所以在代碼中才能使用request.session的方式對session進行操作,django.middleware.common.CommonMiddleware:做一些通用的處理,常用的有兩個功能,一個是:開發者定義url時如果末尾有斜杠,但是用戶訪問時沒有添加這個斜杠,那么此中間件會在用戶訪問時自動重定向到有斜杠的url;另一個是:通過在settings.py中配置DISALLOWED_USER_AGENTS串列,串列中使用正則運算式定義請求頭中User-Agent項的查找條件,表示如果請求頭中的User-Agent滿足這些條件時則此請求不進行處理,在進行一些反爬蟲操作時可以使用這個功能,
# settings.py中配置DISALLOWED_USER_AGENTS
import re
DISALLOWED_USER_AGENTS = [
re.compile(r'^\s$|^$'),
re.compile(r'.*PhantomJS.*')
]
django.middleware.csrf.CsrfViewMiddleware:CSRF保護的中間件,django.contrib.auth.middleware.AuthenticationMiddleware:給request添加一個user物件,django.contrib.messages.middleware.MessageMiddleware:訊息處理中間件,django.middleware.clickjacking.XFrameOptionsMiddleware:clickjacking攻擊的保護,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/195954.html
標籤:其他
上一篇:mybatis 框架學習筆記
