使用 Django 中的 csrf 處理

Django中有一個(gè)django.middleware.csrf.CsrfViewMiddleware中間件提供了全局的csrf檢查。它的原理是在<form>標(biāo)簽中生成一個(gè)隱藏的<input>標(biāo)簽,提交表單時(shí)將這個(gè)隱藏的<input>一起提交,服務(wù)器端驗(yàn)證這個(gè)字段是否正確。

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

  1. MIDDLEWARE_CLASSES中添加django.middleware.csrf.CsrfViewMiddleware,開(kāi)啟全局csrf保護(hù)。
  2. 對(duì)于POST至站內(nèi)的表單,在模板中的<form>標(biāo)簽內(nèi)添加{% csrf_token %}模板標(biāo)簽。
  3. 在對(duì)應(yīng)的視圖函數(shù)中確保使用django.template.context_processors.csrfContext處理器。實(shí)現(xiàn)方式有兩種:
    (1). 使用RequestContext或者直接使用通用視圖,它們會(huì)自動(dòng)將csrf_token添加至模板上下文中。
    return render_to_response("xxx.html", context_instance=RequestContext(request))
    (2). 手工導(dǎo)入并使用處理器來(lái)生成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)

但是,手工導(dǎo)入麻煩而且會(huì)使代碼變得難以維護(hù),使用RequestContext也沒(méi)好到哪去, 并且在Django 1.8 的文檔中說(shuō)明context_instance 1.8 之后會(huì)被廢棄。
那我們應(yīng)該如何處理csrf_token呢?其實(shí),Django提供了一個(gè)快捷函數(shù)可以處理這個(gè)問(wèn)題。
django.shortcuts.render在內(nèi)部設(shè)定context_instance缺省是RequestContext的一個(gè)實(shí)例。調(diào)用render便可以自動(dòng)將csrf_token添加至上下文中。


網(wǎng)上有一些博客說(shuō)可以在settings中設(shè)置TEMPLATE_CONTEXT_PROCESSORS實(shí)現(xiàn)全局的csrf_token填充至上下文。
但是我實(shí)驗(yàn)后發(fā)現(xiàn)并不好使,如果有朋友知道原因的話,還望告知。

我在settings中是這樣設(shè)置的:

TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (    
    'django.core.context_processors.csrf',
)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容