Django中有一個django.middleware.csrf.CsrfViewMiddleware
中間件提供了全局的csrf檢查。它的原理是在<form>
標籤中生成一個隱藏的<input>
標籤,提交表單時將這個隱藏的<input>
一塊兒提交,服務器端驗證這個字段是否正確。html
官方給出的csrf的操做步驟是:django
MIDDLEWARE_CLASSES
中添加django.middleware.csrf.CsrfViewMiddleware
,開啓全局csrf保護。<form>
標籤內添加{% csrf_token %}
模板標籤。django.template.context_processors.csrf
Context處理器。實現方式有兩種:RequestContext
或者直接使用通用視圖,它們會自動將csrf_token
添加至模板上下文中。可是,手工導入麻煩並且會使代碼變得難以維護,使用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組件生效,要知足以上三個條件
MIDDLEWARE_CLASSES
中添加django.middleware.csrf.CsrfViewMiddleware
,開啓全局csrf保護。<form>
標籤內添加{% csrf_token %}
模板標籤。