1. 程式人生 > >rest framework認證組件和django自帶csrf組件區別詳解

rest framework認證組件和django自帶csrf組件區別詳解

說明 NPU 1.8 roc ret rest 自己 ext 開啟

使用 Django 中的 csrf 處理

Django中有一個django.middleware.csrf.CsrfViewMiddleware中間件提供了全局的csrf檢查。它的原理是在<form>標簽中生成一個隱藏的<input>標簽,提交表單時將這個隱藏的<input>一起提交,服務器端驗證這個字段是否正確。

官方給出的csrf的操作步驟是:

  1. MIDDLEWARE_CLASSES中添加django.middleware.csrf.CsrfViewMiddleware,開啟全局csrf保護。
  2. 對於POST至站內的表單,在模板中的<form>
    標簽內添加{% csrf_token %}模板標簽。
  3. 在對應的視圖函數中確保使用django.template.context_processors.csrfContext處理器。實現方式有兩種:
    (1). 使用RequestContext或者直接使用通用視圖,它們會自動將csrf_token添加至模板上下文中。
    return render_to_response("xxx.html", context_instance=RequestContext(request))
    (2). 手工導入並使用處理器來生成CSRF token,並將它添加到模板上下文中。例如:
    from django.shortcuts import render_to_response
    from django.template.context_processors import csrf
    def my_view(request):
    c = {}
    c.update(csrf(request))
    # ... view code here
    return render_to_response("a_template.html", c)

但是,手工導入麻煩而且會使代碼變得難以維護,使用RequestContext也沒好到哪去, 並且在Django 1.8 的文檔中說明context_instance 1.8 之後會被廢棄。
那我們應該如何處理csrf_token

呢?其實,Django提供了一個快捷函數可以處理這個問題。
django.shortcuts.render在內部設定context_instance缺省是RequestContext的一個實例。調用render便可以自動將csrf_token添加至上下文中。


網上有一些博客說可以在settings中設置TEMPLATE_CONTEXT_PROCESSORS實現全局的csrf_token填充至上下文。
但是我實驗後發現並不好使,如果有朋友知道原因的話,還望告知。

我在settings中是這樣設置的:

TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (    
    ‘django.core.context_processors.csrf‘,
)


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
自此了解到要想django自帶的csrf組件生效,要滿足以上三個條件
  1. MIDDLEWARE_CLASSES中添加django.middleware.csrf.CsrfViewMiddleware,開啟全局csrf保護。
  2. 對於POST至站內的表單,在模板中的<form>標簽內添加{% csrf_token %}模板標簽。
  3. 用render函數渲染視圖

而rest framework框架是寫前後端分離的項目,返回的結果是用Response返回的,所以django自帶的csrf組件不生效,所以使用rest framework的認證組件進行token的認證,這就解釋了我的迷惑,為什麽rest 框架的請求生命周期中是要經過django的中間件的,也是要經過django的csrf組件的,為什麽我們自己還要編寫認證組件,幹嘛不用django的。



rest framework認證組件和django自帶csrf組件區別詳解