1. 程式人生 > 其它 >37 django中介軟體

37 django中介軟體

django中介軟體是django的門戶

請求來的時候需要先經過中介軟體才能到達真正的django後端
響應走的時候最後也需要經過中介軟體才能傳送出去

當我們需要給web後端新增一些全域性相關的功能時可以使用中介軟體
1.校驗每個使用者的訪問頻率
2.校驗每個使用者的登入狀態
3.使用者黑名單、白名單
4.使用者許可權

1 django自帶七個中介軟體

django.middleware.security.SecurityMiddleware 相當於 from django.middleware.security import SecurityMiddleware
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', ]

CommonMiddleware中介軟體控制了是否重定向到帶/的地址

2 每個中介軟體基本都有process_request和process_response方法

class SessionMiddleware(MiddlewareMixin):
    def process_request(self, request):
        session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME)
        request.session 
= self.SessionStore(session_key) def process_response(self, request, response): return response class CsrfViewMiddleware(MiddlewareMixin): def process_request(self, request): csrf_token = self._get_token(request) if csrf_token is not None: # Use same token next time. request.META['CSRF_COOKIE'] = csrf_token def process_view(self, request, callback, callback_args, callback_kwargs): return self._accept(request) def process_response(self, request, response): return response class AuthenticationMiddleware(MiddlewareMixin): def process_request(self, request): request.user = SimpleLazyObject(lambda: get_user(request))

3.django支援自定義中介軟體

有五個可以自定義的方法:

1.必須掌握
process_request
process_response
2.瞭解即可
process_view
process_template_response
process_exception

4 如何自定義中介軟體

1.在專案名或者應用名下建立一個任意名稱的資料夾
2.在該資料夾內建立一個任意名稱的py檔案
3.在該py檔案內需要書寫類(這個類必須繼承MiddlewareMixin)
然後在這個類裡面就可以自定義五個方法了
(這五個方法並不是全部都需要書寫,用幾個寫幾個)
4.需要將類的路徑以字串的形式註冊到配置檔案中才能生效
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',
    '你自己寫的中介軟體的路徑1',
    '你自己寫的中介軟體的路徑2',
    '你自己寫的中介軟體的路徑3',
]

4.1 process_request


process_request(self,request)
1.當請求來的時候會從上往下依次執行每一箇中間件裡面的該方法
如果沒有則直接下一個
2.當該方法返回了HttpResponse物件 那麼請求不再繼續往後執行
而是直接原路返回

process_request方法就是用來做全域性相關的所有限制功能

自定義中介軟體:

1、在app01下建立mymiddle資料夾
2、在mymiddle下建立mydd.py檔案
3、書寫類(這個類必須繼承MiddlewareMixin)
from django.utils.deprecation import MiddlewareMixin
class MyMiddleware1(MiddlewareMixin):
    def process_request(self, request):
        print('中介軟體1裡的process_request')


class MyMiddleware2(MiddlewareMixin):
    def process_request(self, request):
        print('中介軟體2裡的process_request')

views.py

def my_dd(request):
    print('view裡的')

    return HttpResponse('hello')

4.2 process_response

process_response(self,request,response)
            1.當響應返回的時候會從下往上依次執行每一箇中間件裡面的該方法
            如果沒有則直接下一個 該方法預設要返回response,你也可以返回自己的
            2.該方法返回什麼瀏覽器就會接收到什麼(也就意味著我們可以中途攔截待返回的資料做其他處理)
該方法有兩個額外的引數request,response
class MyMiddleware1(MiddlewareMixin):
    def process_request(self, request):
        print('中介軟體1裡的process_request')
        # return HttpResponse('666')

    def process_response(self, request, response):
        print('中介軟體1裡的process_response')

        return response

class MyMiddleware2(MiddlewareMixin):
    def process_request(self, request):
        print('中介軟體2裡的process_request')

    def process_response(self, request, response):
        print('中介軟體2裡的process_response')

        return response

研究如果在第一個process_request方法就已經返回了HttpResponse物件,那麼響應走的時候是經過所有的中介軟體裡面的process_response還是有其他情況?

答:會直接走同級別的process_reponse返回

4.3 process_view

路由匹配成功之後執行檢視函式之前,會自動執行中介軟體裡面的該放法
順序是按照配置檔案中註冊的中介軟體從上往下的順序依次執行

4.4 process_template_response

返回的HttpResponse物件有render屬性的時候才會觸發
順序是按照配置檔案中註冊了的中介軟體從下往上依次經過

4.5 process_exception

當檢視函式中出現異常的情況下觸發
順序是按照配置檔案中註冊了的中介軟體從下往上依次經過