Django中有一個(gè)django.middleware.csrf.CsrfViewMiddleware
中間件提供了全局的csrf檢查长豁。它的原理是在<form>
標(biāo)簽中生成一個(gè)隱藏的<input>
標(biāo)簽谴供,提交表單時(shí)將這個(gè)隱藏的<input>
一起提交汰现,服務(wù)器端驗(yàn)證這個(gè)字段是否正確算利。
官方給出的csrf的操作步驟是:
- 在
MIDDLEWARE_CLASSES
中添加django.middleware.csrf.CsrfViewMiddleware
,開啟全局csrf保護(hù)戚扳。 - 對(duì)于POST至站內(nèi)的表單么翰,在模板中的
<form>
標(biāo)簽內(nèi)添加{% csrf_token %}
模板標(biāo)簽。 - 在對(duì)應(yīng)的視圖函數(shù)中確保使用
django.template.context_processors.csrf
Context處理器暴心。實(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
也沒好到哪去筋粗, 并且在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',
)