這篇文章主要介紹Django中間件是什么,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
萊蕪網站建設公司成都創新互聯,萊蕪網站設計制作,有大型網站制作公司豐富經驗。已為萊蕪超過千家提供企業網站建設服務。企業網站搭建\外貿網站制作要多少錢,請找那個售后服務好的萊蕪做網站的公司定做!
Django-中間件的介紹及使用:
1、Django簡介
Django的中間件類似于Linux中的管道符; Django的中間件實質就是一個雷,類之中有Django已經定義好了一些方法; Django內部的中間件注冊在setting,py文件; 對全局的http請求做處理的時候可以使用中間件; 中間件中的方法不一定要全部使用,需要哪個用哪個; Django的中間件繼承自MiddlewareMixin這個中間件
MiddlewareMixin是調用了其內部的__call__方法,__call__方法以反射的方式執行
process_request和process_response方法。
2、中間件方法
process_request(self,request)
process_request有一個參數,就是request,這個request和視圖函數中的request是一樣的。
它的返回值可以是None也可以是HttpResponse對象。返回值是None的話,按正常流程繼續走,交給下一個中間件處理,如果是HttpResponse對象,Django將不執行視圖函數,而將相應對象返回給瀏覽器。
在這個方法中是沒有return方法的,如果有那就會執行process_response方法,直接返回給客戶端,一般情況下我們是不會在這里返回內容的,除非你有需求,判斷發過來的請求過來的內容,如果不是很友好的請求,那么我們直接就可以在這返回,直接卡死,讓這個請求直接都進不了我們的django中的內部程序
process_response(self, request, response)
它有兩個參數,一個是request,一個是response,request就是上述例子中一樣的對象,response是視圖函數返回的HttpResponse對象。該方法的返回值也必須是HttpResponse對象。
在這個方法中我們必須要有return方法,這樣才能一步一步的返回給客戶端,當然你也可以寫一些東西在response里,在這里寫就是會在所有的response里都會有你所添加的內容!
process_view(self, request, view_func, view_args, view_kwargs)
該方法有四個參數
request是HttpRequest對象。 view_func是Django即將使用的視圖函數。 (它是實際的函數對象,而不是函數的名稱作為字符串。) view_args是將傳遞給視圖的位置參數的列表. view_kwargs是將傳遞給視圖的關鍵字參數的字典。 view_args和view_kwargs都不包含第一個視圖參數(request)。 Django會在調用視圖函數之前調用process_view方法。
它應該返回None或一個HttpResponse對象。 如果返回None,Django將繼續處理這個請求,執行任何其他中間件的process_view方法,然后在執行相應的視圖。 如果它返回一個HttpResponse對象,Django不會調用適當的視圖函數。 它將執行中間件的process_response方法并將應用到該HttpResponse并返回結果。
先執行路由匹配,再執行process_view方法,再執行視圖函數
這個方法中是沒有return方法的,如果有那就走process_response方法,視圖函數不會執行
process_exception(self, request, exception)
該方法兩個參數:
一個HttpRequest對象 一個exception是視圖函數異常產生的Exception對象。
這個方法只有在視圖函數中出現異常了才執行,它返回的值可以是一個None也可以是一個HttpResponse對象。如果是HttpResponse對象,Django將調用模板和中間件中的process_response方法,并返回給瀏覽器,否則將默認處理異常。如果返回一個None,則交給下一個中間件的process_exception方法來處理異常。它的執行順序也是按照中間件注冊順序的倒序執行。
process_template_response(self,request,response)
它的參數,一個HttpRequest對象,response是TemplateResponse對象(由視圖函數或者中間件產生)。
process_template_response是在視圖函數執行完成后立即執行,但是它有一個前提條件,那就是視圖函數返回的對象有一個render()方法(或者表明該對象是一個TemplateResponse對象或等價方法)。
3、中間件的應用
基于中間件實現簡單用戶登錄驗證
中間件版的登錄驗證需要依靠session,所以數據庫中要有django_session表。
定義路由 from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^index/$', views.index), url(r'^login/$', views.login, name='login'), ]
視圖函數
from django.shortcuts import render, HttpResponse, redirect def index(request): return HttpResponse('this is index') def home(request): return HttpResponse('this is home') def login(request): if request.method == "POST": user = request.POST.get("user") pwd = request.POST.get("pwd") if user == "Q1mi" and pwd == "123456": # 設置session request.session["user"] = user # 獲取跳到登陸頁面之前的URL next_url = request.GET.get("next") # 如果有,就跳轉回登陸之前的URL if next_url: return redirect(next_url) # 否則默認跳轉到index頁面 else: return redirect("/index/") return render(request, "login.html")
定義頁面login.html
登錄頁面
定義中間件middlewares.py
c
lass AuthMD(MiddlewareMixin): white_list = ['/login/', ] # 白名單 balck_list = ['/black/', ] # 黑名單 def process_request(self, request): from django.shortcuts import redirect, HttpResponse next_url = request.path_info print(request.path_info, request.get_full_path()) if next_url in self.white_list or request.session.get("user"): return elif next_url in self.balck_list: return HttpResponse('This is an illegal URL') else: return redirect("/login/?next={}".format(next_url))
注冊
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', 'middlewares.AuthMD', ]
AuthMD中間件注冊后,所有的請求都要走AuthMD的process_request方法。
訪問的URL在白名單內或者session中有user用戶名,則不做阻攔走正常流程;
如果URL在黑名單中,則返回This is an illegal URL的字符串;
正常的URL但是需要登錄后訪問,讓瀏覽器跳轉到登錄頁面。
注:AuthMD中間件中需要session,所以AuthMD注冊的位置要在session中間的下方。
以上是Django中間件是什么的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注創新互聯行業資訊頻道!