1-中間件的概念
Django中間件(Middleware)是一個輕量級、底層的“插件”系統,可以介入Django的請求和響應處理過程,修改Django的輸入或輸出.
用戶—通過請求request----中間件----通過請求quest----urls以及視圖層
urls以及視圖層–返回響應response—中間件—返回響應response—用戶
2-django中的中間件
django 中的中間件(middleware),在django中,中間件其實就是一個類,在請求到來和結束後,django會根據自己的規則在合適的時機執行中間件中相應的方法。
在django項目的settings模塊中,有一個 MIDDLEWARE_CLASSES 變量,其中每一個元素就是一箇中間件.
3-中間的執行順序
請求以自上而下的順序通過所有的層,view函數處理之後,響應以自下而上的順序通過所有的層,期間經過的每個中間件都會對請求或者響應進行處理
4-中間件的結構
中間件中可以定義5個方法,分別是:
process_request(self,request) :
執行視圖之前被調用,在每個請求上調用,返回None或HttpResponse對象
process_view(self, request, callback, callback_args, callback_kwargs):
調用視圖之前被調用,在每個請求上調用,返回None或HttpResponse對象
process_template_response(self,request,response):
在視圖剛好執行完畢之後被調用,在每個請求上調用,返回實現了render方法的響應對象
process_exception(self, request, exception)
當視圖拋出異常時調用,在每個請求上調用,返回一個HttpResponse對象
process_response(self, request, response)
所有響應返回瀏覽器之前被調用,在每個請求上調用,返回HttpResponse對象
5-自定義中間件第一種方式例子
在項目根目錄下app下創建mymiddleware.py文件(在自己想要在哪個APP目錄下創建.py文件)
在mymiddleware.py文件下
from django.utils.deprecation import MiddlewareMixin
class MyMidd(MiddlewareMixin):
def process_request(self,request):
print("自定義請求方法")
return None
def process_response(self, request, response):
print("自定義響應方法")
return response
在settings.py下的middleware下配置
例子實現:所有頁面檢查用戶是否登錄
views.py
def index(request):
"""
查找 如果查到了就直接顯示登錄狀態 沒有就提示登錄
:param request:
:return:
"""
username = getattr(request,"username")#獲取request中的username屬性
return render(request,'dom/index.html',context={
'username':username,
})
class LoginResponse(View):
def get(self, request):
return render(request,"dom/login.html")
def post(self, request):
"""
1-獲取參數
2-校驗參數
3-業務邏輯
4-返回響應
:param request:
:return:
"""
#1-獲取用戶名
username = request.POST.get("username")
#2-設置session
request.session["username"] = username
#3-設置時間 判斷用戶是否有勾選記住我 如果勾選 設置15天登錄
#沒有勾選 當會話結束時結束登錄狀態
request.session.set_expiry(0)
return redirect(reverse('dom:index'))
def exit(request):
request.session.flush()
return redirect(reverse("dom:index"))
在mymiddleware.py文件下
class UserLogin(MiddlewareMixin):
def process_request(self,request):
username = request.session.get("username", "未登錄")
#設置屬性
setattr(request,'username',username)
return None
def process_response(self, request, response):
print("自定義響應方法")
return response
urls.py
from django.urls import path
from . import views
app_name="LG"
urlpatterns = [
path('index/',views.index,name='index'),
path('register/',views.register,name='register'),
path('login/',views.login,name='login'),
path('exit/',views.exit,name='exit'),
]
中間件設置
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',#處理登錄狀態 session
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', #防跨域攻擊
'django.contrib.auth.middleware.AuthenticationMiddleware',#用戶對象
'django.contrib.messages.middleware.MessageMiddleware', #消息處理
'django.middleware.clickjacking.XFrameOptionsMiddleware',
#'FM_demo.mymiddleware.MyMidd',
'FM_demo.mymiddleware.UserLogin',
]
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首頁</title>
</head>
<body>
歡迎:{{ username }}<br>
{{ name }}<br>
<a href="{% url 'dom:login' %}">登錄</a><br>
<a href="{% url 'dom:exit' %}">退出</a>
</body>
</html>
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登錄</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
<input type="text" name="username" placeholder="請輸入用戶名"><br>
<input type="password" name="password" placeholder="請輸入密碼"><br>
<input type="text" name="message" placeholder="請輸入驗證碼"><br>
<input type="text" name="email" placeholder="請輸入郵箱"><br>
<input type="date" name="birthday" placeholder="請輸入出生日期"><br>
<input type="submit" value="登錄">
</form>
</body>
</html>
效果演示:
基本案例就實現了