django框架之中間件

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>

效果演示:
在這裏插入圖片描述
在這裏插入圖片描述
基本案例就實現了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章