中間件是django的門戶,在請求響應進入進出django的時候,都需要先經過中間件,用來全局改變django的輸入和輸出。
創新互聯建站長期為近1000家客戶提供的網站建設服務,團隊從業經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯網生態環境。為青島企業提供專業的網站建設、網站設計,青島網站改版等技術服務。擁有10余年豐富建站經驗和眾多成功案例,為您定制開發。
django中自帶7個中間件,每個中間件都有其特定的功能,并且django支持自定義中間件。
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',
]
django中涉及到全局相關的功能,都可以利用中間件來完成,例如:
1.全局身份的校驗
2.全局用戶權限的校驗
3.全局訪問頻率的校驗等等
django給自定義中間件類提供了5個自定義的方法,分別是:
1.process_request
2.process_response
3.process_view
4.process_templates_response
5.process_exception
前兩個必須掌握,后三個了解即可!
自定義的步驟:
1.在項目文件或者應用文件下創建一個任意名稱的文件夾
2.在該文件夾內創建一個任意名字的py文件
3.在該py文件中定義一個類,該類必須繼承MiddlewareMixin類
(需要導入MiddlewareMixin類,from django.utils.deprecation import MiddlewareMixin)
4.定義的類里面必須至少有一個自定義方法
5.在setting.py里面注冊該中間件的路徑
1.請求來的時候會經過每一個中間件的process_request方法,經過的順序是setting.py里中間件注冊的順序從上往下
2.該方法有一個request參數
3.如果中間件里沒有該方法,則直接跳過該中間件,執行下一個。
4.如果該方法中返回了HttpResponse對象,則請求將不在往下執行,直接走同級的process_response返回
(flask框架是需要走完所有的類似于proces_response方法)
5.process_request就是用來作全局相關的所有限制功能
1.響應走的時候會經過每一個中間件的process_response方法,經過的順序是setting.py里中間件從下往下的順序
2.該方法有兩個參數request和response參數
3.該方法必須返回一個HttpResponse對象,默認是返回response,即return response;也可以自定義返回其他
4.如果中間件里沒有該方法,則直接跳過該中間件,執行下一個。
process_view
路由匹配成功之后執行視圖函數之前,會自動執行中間件里面的該放法
順序是按照配置文件中注冊的中間件從上往下的順序依次執行
process_template_response
返回的HttpResponse對象有render屬性的時候才會觸發
順序是按照配置文件中注冊了的中間件從下往上依次經過
process_exception
當視圖函數中出現異常的情況下觸發
順序是按照配置文件中注冊了的中間件從下往上依次經過
要求:寫一個中間件,使得每次請求來的時候,不管是urlencoded編碼格式還是json編碼格式傳到后端的數據都變成字典格式封裝到request.data里!
前端頁面的搭建:
簡單輸入框的搭建和兩種提交方式提交數據
<body>
<form action="" method="post">
<label for="">用戶名:</label>
<input type="text" name="name" id="id_username">
<label for="">密碼:</label>
<input type="text" name="pwd" id="id_password">
<input type="submit">
<input type="button" id="btn" value="提交2">
</form>
</body>
<script>
$('#btn').click(function (){
$.ajax({
type:'post',
url:'',
data:JSON.stringify({
'name':$('#id_username').val(),
'pwd':$('#id_username').val(),
'csrfmiddlewaretoken':'{{ csrf_token }}',
}),
contentType:'application/json',
})
})
</script>
</html>
中間件的書寫:
from django.utils.deprecation import MiddlewareMixin
import json
class JsonMiddle(MiddlewareMixin):
# 請求來的時候經過這個中間件
def process_request(self,request):
try:
# 未出現異常(當前端傳來的是json格式數據時),將json格式數據反序列化放入request.data中
request.data = json.loads(request.body)
except Exception as e:
# 當出現異常(前端傳來的是urlencoded編碼格式的數據時),也將數據交給request.data中
request.data = request.POST
# 這個不管前端是什么格式的數據,我后端request.data里的數據格式都是字典格式
# 只不過request.POST格式的字典格式是QueryDic字典格式,比平常的字典格式更強大的是不能隨意刪除該字典中的值,刪除會保存
中間件的注冊:
后端視圖書寫:
此時urlencoded編碼格式和json格式都是在request.data中以字典形式存在
def index(request):
if request.method == 'POST':
print(request.data)
return render(request,'index.html')
注意點:
1.form表單和ajax提交有可能會重復提交,form表單中(有ajax請求)submin類型和button按鈕都會觸發form表單提交,input標簽的button則不會觸發form表單提交
2.QueryDict本身就是一個字典,但是比字典強大,不能修改值,一修改報錯
3.CommonMiddleware讀一下這個django中間件
名稱欄目:django中的中間件
網頁網址:http://www.hntjjpw.com/article18/dsogidp.html
成都網站建設公司_創新互聯,為您提供微信小程序、搜索引擎優化、品牌網站設計、服務器托管、外貿網站建設、手機網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯