CSRF verification failed. Request aborted.

在使用Django提交Post表單時遇到以下錯誤:html

  1. Forbidden (403)  
  2. CSRF verification failed. Request aborted.  


緣由在"幫助"中已經寫的很清楚了。python

 

通常而言,這能夠發生時,有一個真正的跨站請求僞造,或當Django的CSRF的機制尚未正確使用。 對於POST表單,您須要確保:django

*該視圖功能使用模板RequestContext的。session

*在模板中,有{%csrf_token%}(模板網址標記在每一個郵局形式的內部目標。spa

*若是您不使用CsrfViewMiddleware,那麼你必須在view中使用csrf_protect,

.net

您看到此頁面的幫助部分,由於你在settings中設置了 DEBUG = True。 改變這種情況爲False,只有最初的錯誤信息會被顯示。您可使用CSRF_FAILURE_VIEW設置自定義此頁面。code

 

因此,解決方法:orm

 

一、在表單Form里加上{% csrf_token %}csrf

二、在Settings裏的MIDDLEWARE_CLASSES增長配置:(通常默認就有)htm

'django.middleware.csrf.CsrfViewMiddleware',

#'django.middleware.csrf.CsrfResponseMiddleware',

1.2.X示例:

  1. MIDDLEWARE_CLASSES = (  
  2.     'django.middleware.common.CommonMiddleware',  
  3.     'django.contrib.sessions.middleware.SessionMiddleware',  
  4.     'django.middleware.csrf.CsrfViewMiddleware',  
  5.     'django.middleware.csrf.CsrfResponseMiddleware',  
  6.     'django.contrib.auth.middleware.AuthenticationMiddleware',  
  7.     'django.contrib.messages.middleware.MessageMiddleware',  
  8. )  

 

三、在view中的方法上面加上@csrf_protect註解。同時使用RequestContext代替Context。示例:

----------------------------------------------------------------------------------------------------------------------------------

@csrf_protect    
def login(request):

...

return render_to_response('index.html',context_instance=RequestContext(request))

----------------------------------------------------------------------------------------------------------------------------------

 

詳情: 

https://docs.djangoproject.com/en/1.2/ref/contrib/csrf/

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ref-contrib-csrf

 

 


擴展閱讀:

 

django.contrib.csrf 開發包只有一個模塊: middleware.py 。該模塊包含了一個 Django 中間件類——CsrfMiddleware ,該類實現了 CSRF 防禦功能。

 
 

在設置文件中將 'django.contrib.csrf.middleware.CsrfMiddleware' 添加到 MIDDLEWARE_CLASSES 設置中可激活 CSRF 防禦。 該中間件必須在 SessionMiddleware 以後 執行,所以在列表中 CsrfMiddleware 必須出如今SessionMiddleware 以前 (由於響應中間件是自後向前執行的)。 同時,它也必須在響應被壓縮或解壓以前對響應結果進行處理,所以 CsrfMiddleware 必須在 GZipMiddleware 以後執行。一旦將它添加到MIDDLEWARE_CLASSES設置中,你就完成了工做。

相關文章
相關標籤/搜索