用戶訪問的頻率限制前端
設置黑名單,白名單python
全部用戶登錄校驗web
只要是涉及到網址全局的功能 都要考慮使用中間件ajax
是一個處理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
這五個方法都是在特定的條件纔會自動觸發,按照生命週期順序走的.
新建一個文件夾,並創建子文件,任意名稱便可(最好有辨識度)
寫類,固定繼承
from django.utils.deprecation import MiddlewareMixin class MyMiddle(MiddlewareMixin): ...
去配置把新建文件路徑添加到中間件配置中
重要
process_request():
請求來的時候通過...request,一旦裏面返回了HttpResponse對象那麼就再也不日後執行了 會執行同一級別的process_response
def process_request(self,request): print('process_rquest') return HttpResponse('我是第一個自定義中間件中HttpResponse對象返回值') # 原地直接返回
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---全稱爲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>
本身在頁面上寫上{%csrf_token%}獲取到隨機字符串,而後利用標籤查找,在ajax發送的數據的data中加鍵值對
data:{'username':'jason','csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()},
django提供的模板語法,可是在先後端分離的時候就不能用了,因此不推薦。
data:{'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'}
方式三 拷貝官方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')