Django-24 中間件 編寫中間件 註冊中間件 案例:訪問5次禁止訪問 CSRF防範

  • 中間件是Django請求/響應處理的鉤子框架。它是一個輕量級的、低級的“插件”系統,用於全局改變Django的輸入輸出
  • 中間件以類的形式體現
  • 每個中間件組件負責做一些特定的功能。例如:Django包含一箇中間件組件AuthenticationMiddleware,它使用會話將用戶與請求關聯起來。

編寫中間件

  • 中間件類必須繼承自django,urils.deprecation.MiddlewareMixin類

  • 中間件類需事先下列五個方法中的一個或多個:

    • process_request(self,request):
      執行路由前被調用,在每個請求上調用,返回None或HttpResponse對象
    • process_view(self,request,callback,callback_args,callback_kwargs):
      調用視圖之前被調用,在每個請求上調用,返回None或HttpResponse對象
    • process_response(self,request,response)
      所有響應返回瀏覽器前被調用,在每個請求上調用,返回HttpResponse對象
    • process_exception(self,request,exception)
      當處理過程中拋出異常時調用,返回一個HttpResponse對象
    • process_template_response(self,request,response)
      在視圖函數執行完畢且試圖返回的對象中包含render方法時被調用;該方法需要返回實現了render方法的響應對象
  • 注:中間件的大多數方法在返回None時表示忽略當前操作進入下一項事件,當返回HttpResponse對象時表示此請求結束,直接返回給客戶端

註冊中間件

  • settings.py 中需要註冊一下,自定義的中間件
MIDDLEWARE = [
  ...
]
  • 注意:配置爲數組,中間件被調用時以“先上到下”再“由下到上”的順序調用

案例:訪問5次禁止訪問


class VisitLimit(MiddlewareMixin):

    visit_times = {}

    def process_request(self,request):
        ip_address = request.META['REMOTE_ADDR']
        path_url = request.path_info
        if not re.match('^/test',path_url):
            return 
        times = self.visit_times.get(ip_address,0)
        print('ip',ip_address,'已經訪問',times)
        self.visit_times[ip_address] = times + 1
        if times < 5:
            return
        
        return HttpResponse("您已經訪問過"+str(times)+"次,訪問被禁止")

CSRF防範

  • django採用'比對暗號'機制防止攻擊
  • Cookies中存儲暗號1,模板中表單裏藏着暗號2,用於只有在本網站下提交數據,暗號2纔會隨表單提交給服務器,django對比兩個暗號,對比成功,則認爲是合法請求,否則是違法請求-403響應碼

配置步驟:

1,settings.py中確認MIDDLEWARE中django.middleware.csrf.CsrfViewMiddleware是否打開
2,模板中,form標籤下添加如下標籤

{% csrf_token %}

特殊說明

如果某個視圖不需要django進行csrf保護,可以用裝飾器關閉對此視圖的檢查
樣例:

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_view(request):
  return HttpResponse('Hello world')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章