Django--中間件

Django中間件

用戶訪問的頻率限制前端

設置黑名單,白名單python

全部用戶登錄校驗web

只要是涉及到網址全局的功能 都要考慮使用中間件ajax

簡介

是一個處理django請求和相應的框架級別的鉤子.是一個輕量,低級別的插件系統,用在全局範圍內改變Django的輸入和輸出.每一箇中間件組件都負責作一個特定的功能.數據庫

由於影響全局,使用不當會影響性能.django

django生命週期中中間件

首先 它是放在在django項目裏的settings.py文件下後端

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',
]

那麼中間件的方法何時被執行呢,以下圖所示瀏覽器

能夠看到django默認有七個中間件,這七個中間件至關於django的保安,請求來的時候響應的時候都要走這裏通過每個中間件的檢驗,web網關接口走完的時候直接走到中間件,中間件檢驗完了去緩存數據庫找有沒有 沒有的話再日後面走,回來的時候從views走到中間件而後到緩存數據庫備份一份,最後在走瀏覽器.緩存

自定義中間件

中間件能夠定義五個方法.主要的是process_request和process_responsecookie

這五個方法都是在特定的條件纔會自動觸發,按照生命週期順序走的.

操做步驟

  1. 新建一個文件夾,並創建子文件,任意名稱便可(最好有辨識度)

    寫類,固定繼承

    from django.utils.deprecation import MiddlewareMixin
    class MyMiddle(MiddlewareMixin):
        ...
  2. 去配置把新建文件路徑添加到中間件配置中

自定義中間件解釋

重要

  1. process_request():

    請求來的時候通過...request,一旦裏面返回了HttpResponse對象那麼就再也不日後執行了 會執行同一級別的process_response

    def process_request(self,request):
        print('process_rquest')
        return HttpResponse('我是第一個自定義中間件中HttpResponse對象返回值') # 原地直接返回
  2. process_response():

    響應走的時候 從下往上一次進入每個中間件裏面的process_response

    def process_response(self,request,response):
        print('我是第一個中間件裏的process_response')
        return response

明白瞭解

process_view:路由匹配成功以後執行視圖函數以前觸發
            process_exception:當視圖函數出現異常(bug)的時候自動觸發
            process_template_response:當視圖函數執行完畢以後而且返回的對象中含有render方法的狀況下才會觸發

跨站請求僞造(csrf) ,設置scrf值,CBV加裝飾器

csrf---全稱爲cross-site request forgery

什麼是釣魚網站?

即假冒真正的網站欺騙用戶,拿着真正的用戶輸入的數據,修改以後向真正的網址發送post請求

舉個例子

"""

釣魚網站就是說別人搭建了一個跟銀行如出一轍的web頁面,你在網站轉帳的時候 ,錢確實會少,可是你轉帳的目標其實是別人的帳號,別人給你暴露的只是一
個沒有name屬性的input的框.
原理
你輸入的用戶名  密碼  支付密碼 都會真實的提交給銀行後臺,可是轉帳的帳,別人提早寫好了一個隱藏帶有name和value的input框.


"""

這樣是否是感受特別可怕了,可是隻要思想不滑坡,方法總比問題多

解決釣魚網站方法!

只要是用戶想要提交post請求的頁面,那麼在返回的時候提早設置好一個隨機字符串,當用戶提交post請求的時候 我就自動查找是否是有這個隨機字符串,
有則提交
無則403

'django.middleware.csrf.CsrfViewMiddleware'

Django中這個中間件就是來檢驗用戶提交post請求的時候有沒有這個提交設置好的隨機字符串.

只要在form表單里加上{%csrf_token%}就能夠經過校驗了.

<form action="" method="post">
    {% csrf_token %}
    <p>username:<input type="text" name="username"></p>
    <p>target_user:<input type="text" name="target_user"></p>
    <p>money:<input type="text" name="money"></p>
    <input type="submit">
</form>
  1. ajax作法

本身在頁面上寫上{%csrf_token%}獲取到隨機字符串,而後利用標籤查找,在ajax發送的數據的data中加鍵值對

data:{'username':'jason','csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()},

  1. django提供的模板語法,可是在先後端分離的時候就不能用了,因此不推薦。

    data:{'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'}

  2. 方式三 拷貝官方js文件,最好把這段代碼保存在本地,用的時候只須要寫一個靜態文件,配置一下便可

    function getCookie(name) {
        var cookieValue = null;
        if (document.cookie && document.cookie !== '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) === (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
    var csrftoken = getCookie('csrftoken');
    
    
    
    function csrfSafeMethod(method) {
      // these HTTP methods do not require CSRF protection
      return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    }
    
    $.ajaxSetup({
      beforeSend: function (xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
          xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
      }
    });

    前端導入

    <script src="/static/setup.js"></script>

    若是說個別函數不想被校驗怎麼辦?

    先導入一個模塊

    from django.views.decorators.csrf import csrf_exempt,csrf_protect

    根據英文解釋exempt就是免除校驗的意思,protect就是保護的意思,就是讓你校驗,decorators即爲裝飾器

    根據以上推論得出(先寫FBV型)

    @csrf_exempt #裝飾了這個裝飾器以後,就能夠繞過校驗了。不用那個隨機字符串了
    def exem(request):
        return HttpResponse('exempt')
    
    @csrf_protect #裝飾了這個裝飾器就會被校驗了。
    def pro(request):
        return HttpResponse('pro')

    寫完FBV型,那麼CBV型該怎麼寫呢

    from django.views import View
            from django.views.decorators.csrf import csrf_exempt, csrf_protect
            from django.utils.decorators import method_decorator
            # 第一種
            # @method_decorator(csrf_exempt,name='dispatch')
            class MyCsrf(View):
                # 第二種
                @method_decorator(csrf_exempt)
                def dispatch(self, request, *args, **kwargs):
                    return super().dispatch(request,*args,**kwargs)
                def get(self,request):
                    return HttpResponse('hahaha')
                    
            除了csrf_exempt以外 全部的其餘裝飾器 在CBV上面都有三種方式
            @method_decorator(csrf_protect,name='post') #第一種
            class MyCsrf(View):
                @method_decorator(csrf_protect)#第二種
                def dispatch(self, request, *args, **kwargs):
                    return super().dispatch(request,*args,**kwargs)
                def get(self,request):
                    return HttpResponse('hahaha')
    
                @method_decorator(csrf_protect)#第三種
                def post(self,request):
                    return HttpResponse('post')
相關文章
相關標籤/搜索