官方的說法:中間件是-個用來處理Django的請求和響應的框架級別的鉤子。它是一個輕量、低級別的插件系統,用於在全局範圍內改變Django的輸入和輸出。每一箇中間件組件都負責作一些特定的功能。
可是因爲其影響的是全局,因此須要謹慎使用,使用不當會影響性能。
說的直白一點中間件是幫助咱們在視圖函數執行以前和執行以後均可以作一些額外的操做,它本質上就是一個自定義類, 類中定義了幾個方法,Django框架會在請求的特定的時間去執行這些方法。html
用戶訪問頻率限制
用戶是不是黑名單 白名單
全部用戶登陸校驗
只要是涉及到網址全局的功能 你就應該考慮使用中間件python
django中間件暴露給程序員五個能夠自定義的方法(五個方法都是在特定的條件下自動觸發的)程序員
須要掌握的:
process_request:請求來的時候 會從上往下依次通過每個中間件裏面process_request,一旦裏面返回了HttpResponse對象那麼就再也不日後執行了 會執行同一級別process_response數據庫
def process_request(self,request):
print('我是第一個自定義中間件裏面的process_request方法')
return HttpResponse("我是第一個自定義中間件裏面的HttpResponse對象返回值") # 直接原地返回django
process_response:響應走的時候 會從下往上依次進過每個中間件裏面的process_response
def process_response(self,request,response): # response就是要返回給用戶的數據
print("我是第一個自定義中間件裏面的process_response方法")
return responsesession
瞭解的
process_view:路由匹配成功以後執行視圖函數以前觸發
process_exception:當視圖函數出現異常(bug)的時候自動觸發
process_template_response:當視圖函數執行完畢以後而且返回的對象中含有render方法的狀況下才會觸發app
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse
class MyMiddle1(MiddlewareMixin):
def process_request(self,request):
print('我是第一個自定義中間件裏面的process_request方法')
# return HttpResponse("我是第一個自定義中間件裏面的HttpResponse對象返回值")框架
def process_response(self,request,response): # response就是要返回給用戶的數據 print("我是第一個自定義中間件裏面的process_response方法") return response def process_view(self,request,view_func,view_args,view_kwargs): print(view_func,view_args,view_kwargs) print('我是第一個自定義中間件裏面的process_view方法') def process_exception(self,request,exception): print(exception) print('我是第一個自定義中間件裏面的process_exception方法') def process_template_response(self,request,response): print('我是第一個自定義中間件裏面的process_template_response方法') return response
class MyMiddle2(MiddlewareMixin):
def process_request(self,request):
print('我是第二個自定義中間件裏面的process_request方法')函數
def process_response(self, request, response): # response就是要返回給用戶的數據 print("我是第二個自定義中間件裏面的process_response方法") return response def process_view(self,request,view_func,view_args,view_kwargs): print(view_func,view_args,view_kwargs) print('我是第二個自定義中間件裏面的process_view方法') def process_exception(self,request,exception): print(exception) print('我是第二個自定義中間件裏面的process_exception方法') def process_template_response(self,request,response): print('我是第二個自定義中間件裏面的process_template_response方法') return response
```post
裏面寫類 固定繼承
from django.utils.deprecation import MiddlewareMixin
class MyMiddle(MiddlewareMixin):
...
2.去配置文件註冊到中間件配置中
你須要手寫字符串的路徑
'app01.mymiddleware.myaabb.MyMiddle1'
#### 中間件版登陸驗證:
中間件版的登陸驗證須要依靠session,因此數據庫中要有Django_session表
urls.py:
from app02 import views a3 v2 urlpatterna = [ url (r1^admin/',admin. site.ur13), url (r1^1ogin/' ,v2.10gin), url (r'^home/' ,v2.home), url (I' ^index/',v2. index) ]
views.py
from django.shortcuts import render,redirect,HttpResponse from app02 import models # Create your views here. def login(request): error_msg='' if request.method=='POST': username=request.POST.get('username') password=request.POST.get('password') user_obj=models.User.objects.filter(username=username,password=password) if user_obj: #設置session request.session['login']='ok' #獲取用戶想直接訪問的URL url=request.GET.get('next') #若是有,就跳轉到客戶初始想訪問的URL if not url: #沒有則默認跳轉到home頁面 url='/home/' return redirect(url) else: error_msg='username or password error!' return render(request,'login.html',{'error_msg':error_msg}) def home(request): return HttpResponse('<h1>這是home頁面 只有登陸了才能看到</h1>') def index(request): return HttpResponse('<h1>這是index頁面 也只有登陸了才能看到<h1>')
login.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登錄頁面</title> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <form action="" method="post"> {% csrf_token %} <label for="">username:<input type="text" name="username"></label> <label for="">password:<input type="password" name="password"></label> <input type="submit" value="submit"> </form> <h1 style="color: red">{{ error_msg }}</h1> </body> </html>
middlewares.py
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import redirect class Check_Login(MiddlewareMixin): def process_request(self,request): next_url=request.path_info if not next_url.startswith('/login/'): is_login=request.session.get('login','') if not is_login: return redirect('/login/?next={}'.format(next_url))
settings.py 註冊:
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', 'middleware.my_middleware.Check_Login', ]