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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Django-中介軟體Django
- django中介軟體介紹Django
- 軟體測試--中介軟體介紹
- 簡單介紹redux的中介軟體Redux
- 軟體介紹使用
- Django筆記二十九之中介軟體介紹Django筆記
- nSMS-企業級簡訊中介軟體介紹
- nMail-企業級郵件中介軟體介紹AI
- Laravel 中介軟體使用及原始碼分析Laravel原始碼
- lazarus中介軟體簡介
- pip軟體包管理工具介紹及基本使用
- 中介軟體redis的使用Redis
- Laravel8中介軟體組的簡單使用Laravel
- gin使用中介軟體
- 訊息中介軟體 — RocketMQ簡介MQ
- Express 文件(使用中介軟體)Express
- Django 2.1.3 中介軟體使用Django
- vagrant介紹及使用
- JEB工具的介紹及使用
- Redis中介軟體與Web中介軟體RedisWeb
- 軟體版本控制介紹
- 多路徑軟體介紹
- 【MYsql】Maxscale中介軟體使用MySql
- Mysql中介軟體 oneProxy的使用總結MySql
- Express的使用筆記3 中介軟體Express筆記
- 訊息中介軟體-RabbitMq相關概念及原理介紹【圖文並茂】MQ
- 資料庫系列: 主流分庫分表中介軟體介紹(圖文總結)資料庫
- 分散式資料庫中介軟體的實現原理介紹一:分庫分表分散式資料庫
- 中介軟體之訊息中介軟體-pulsar
- Docker基本介紹及使用Docker
- Gin框架介紹及使用框架
- VSCode軟體介紹VSCode
- Altium designer軟體介紹
- 【Mysql】KingShard中介軟體的使用與配置MySql
- gin使用BasicAuth()(驗證)中介軟體
- 訊息中介軟體 — 使用場景
- 工控機的軟體的簡單介紹
- iOS系統及客戶端軟體測試的基礎介紹iOS客戶端