真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Django中間件是什么

這篇文章主要介紹Django中間件是什么,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

萊蕪網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),萊蕪網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為萊蕪超過千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的萊蕪做網(wǎng)站的公司定做!

Django-中間件的介紹及使用:

1、Django簡(jiǎn)介

Django的中間件類似于Linux中的管道符;
Django的中間件實(shí)質(zhì)就是一個(gè)雷,類之中有Django已經(jīng)定義好了一些方法;
Django內(nèi)部的中間件注冊(cè)在setting,py文件;
對(duì)全局的http請(qǐng)求做處理的時(shí)候可以使用中間件;
中間件中的方法不一定要全部使用,需要哪個(gè)用哪個(gè);
Django的中間件繼承自MiddlewareMixin這個(gè)中間件

MiddlewareMixin是調(diào)用了其內(nèi)部的__call__方法,__call__方法以反射的方式執(zhí)行

process_request和process_response方法。

Django中間件是什么

2、中間件方法

process_request(self,request)

process_request有一個(gè)參數(shù),就是request,這個(gè)request和視圖函數(shù)中的request是一樣的。

它的返回值可以是None也可以是HttpResponse對(duì)象。返回值是None的話,按正常流程繼續(xù)走,交給下一個(gè)中間件處理,如果是HttpResponse對(duì)象,Django將不執(zhí)行視圖函數(shù),而將相應(yīng)對(duì)象返回給瀏覽器。

在這個(gè)方法中是沒有return方法的,如果有那就會(huì)執(zhí)行process_response方法,直接返回給客戶端,一般情況下我們是不會(huì)在這里返回內(nèi)容的,除非你有需求,判斷發(fā)過來的請(qǐng)求過來的內(nèi)容,如果不是很友好的請(qǐng)求,那么我們直接就可以在這返回,直接卡死,讓這個(gè)請(qǐng)求直接都進(jìn)不了我們的django中的內(nèi)部程序

process_response(self, request, response)

它有兩個(gè)參數(shù),一個(gè)是request,一個(gè)是response,request就是上述例子中一樣的對(duì)象,response是視圖函數(shù)返回的HttpResponse對(duì)象。該方法的返回值也必須是HttpResponse對(duì)象。

在這個(gè)方法中我們必須要有return方法,這樣才能一步一步的返回給客戶端,當(dāng)然你也可以寫一些東西在response里,在這里寫就是會(huì)在所有的response里都會(huì)有你所添加的內(nèi)容!

process_view(self, request, view_func, view_args, view_kwargs)

該方法有四個(gè)參數(shù)

request是HttpRequest對(duì)象。
view_func是Django即將使用的視圖函數(shù)。 (它是實(shí)際的函數(shù)對(duì)象,而不是函數(shù)的名稱作為字符串。)
view_args是將傳遞給視圖的位置參數(shù)的列表.
view_kwargs是將傳遞給視圖的關(guān)鍵字參數(shù)的字典。 view_args和view_kwargs都不包含第一個(gè)視圖參數(shù)(request)。
Django會(huì)在調(diào)用視圖函數(shù)之前調(diào)用process_view方法。

它應(yīng)該返回None或一個(gè)HttpResponse對(duì)象。 如果返回None,Django將繼續(xù)處理這個(gè)請(qǐng)求,執(zhí)行任何其他中間件的process_view方法,然后在執(zhí)行相應(yīng)的視圖。 如果它返回一個(gè)HttpResponse對(duì)象,Django不會(huì)調(diào)用適當(dāng)?shù)囊晥D函數(shù)。 它將執(zhí)行中間件的process_response方法并將應(yīng)用到該HttpResponse并返回結(jié)果。

先執(zhí)行路由匹配,再執(zhí)行process_view方法,再執(zhí)行視圖函數(shù)

這個(gè)方法中是沒有return方法的,如果有那就走process_response方法,視圖函數(shù)不會(huì)執(zhí)行

process_exception(self, request, exception)

該方法兩個(gè)參數(shù):

一個(gè)HttpRequest對(duì)象
一個(gè)exception是視圖函數(shù)異常產(chǎn)生的Exception對(duì)象。

這個(gè)方法只有在視圖函數(shù)中出現(xiàn)異常了才執(zhí)行,它返回的值可以是一個(gè)None也可以是一個(gè)HttpResponse對(duì)象。如果是HttpResponse對(duì)象,Django將調(diào)用模板和中間件中的process_response方法,并返回給瀏覽器,否則將默認(rèn)處理異常。如果返回一個(gè)None,則交給下一個(gè)中間件的process_exception方法來處理異常。它的執(zhí)行順序也是按照中間件注冊(cè)順序的倒序執(zhí)行。

process_template_response(self,request,response)
它的參數(shù),一個(gè)HttpRequest對(duì)象,response是TemplateResponse對(duì)象(由視圖函數(shù)或者中間件產(chǎn)生)。

process_template_response是在視圖函數(shù)執(zhí)行完成后立即執(zhí)行,但是它有一個(gè)前提條件,那就是視圖函數(shù)返回的對(duì)象有一個(gè)render()方法(或者表明該對(duì)象是一個(gè)TemplateResponse對(duì)象或等價(jià)方法)。

3、中間件的應(yīng)用

基于中間件實(shí)現(xiàn)簡(jiǎn)單用戶登錄驗(yàn)證

中間件版的登錄驗(yàn)證需要依靠session,所以數(shù)據(jù)庫中要有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'),
]

視圖函數(shù)

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":
            # 設(shè)置session
            request.session["user"] = user
            # 獲取跳到登陸頁面之前的URL
            next_url = request.GET.get("next")
            # 如果有,就跳轉(zhuǎn)回登陸之前的URL
            if next_url:
                return redirect(next_url)
            # 否則默認(rèn)跳轉(zhuǎn)到index頁面
            else:
                return redirect("/index/")
    return render(request, "login.html")

定義頁面login.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))

注冊(cè)

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中間件注冊(cè)后,所有的請(qǐng)求都要走AuthMD的process_request方法。

訪問的URL在白名單內(nèi)或者session中有user用戶名,則不做阻攔走正常流程;

如果URL在黑名單中,則返回This is an illegal URL的字符串;

正常的URL但是需要登錄后訪問,讓瀏覽器跳轉(zhuǎn)到登錄頁面。

注:AuthMD中間件中需要session,所以AuthMD注冊(cè)的位置要在session中間的下方。

以上是Django中間件是什么的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


網(wǎng)頁題目:Django中間件是什么
網(wǎng)頁URL:http://weahome.cn/article/geoghs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部