Django-中介軟體的介紹及使用

at_1發表於2021-09-11

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

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>登入頁面</title>
</head>
<body>
<form action="{% url 'login' %}">
    <p>
        <label for="user">使用者名稱:</label>
        <input type="text" name="user" id="user">
    </p>
    <p>
        <label for="pwd">密 碼:</label>
        <input type="text" name="pwd" id="pwd">
    </p>
    <input type="submit" value="登入">
</form>
</body>
</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知識,請觀看影片!!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1817/viewspace-2833028/,如需轉載,請註明出處,否則將追究法律責任。

相關文章