【Django】CSRF verification failed. Request aborted.
在使用Django提交Post表單時遇到如下錯誤:
Forbidden (403)
CSRF verification failed. Request aborted.
原因在"幫助"中已經寫的很清楚了。
一般而言,這可以發生時,有一個真正的跨站請求偽造,或當Django的CSRF的機制還沒有正確使用。 對於POST表單,您需要確保:
*該檢視功能使用模板RequestContext的。
*在模板中,有{%csrf_token%}(模板網址標記在每個郵局形式的內部目標。
*如果您不使用CsrfViewMiddleware,那麼你必須在view中使用csrf_protect,
您看到此頁面的幫助部分,因為你在settings中設定了 DEBUG = True。 改變這種狀況為False,只有最初的錯誤資訊會被顯示。您可以使用CSRF_FAILURE_VIEW設定自定義此頁面。
所以,解決方法:
1、在表單Form里加上{% csrf_token %}
2、在Settings裡的
MIDDLEWARE_CLASSES增加配置:(一般預設就有)
'django.middleware.csrf.CsrfViewMiddleware',
#'django.middleware.csrf.CsrfResponseMiddleware',
1.2.X示例:
MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.middleware.csrf.CsrfResponseMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', )
3、在view中的方法上面加上@csrf_protect註解。同時使用RequestContext代替Context。示例:
----------------------------------------------------------------------------------------------------------------------------------
@csrf_protect
def login(request):
...
return render_to_response('index.html',context_instance=RequestContext(request)
----------------------------------------------------------------------------------------------------------------------------------
詳情:
擴充套件閱讀:
django.contrib.csrf 開發包只有一個模組: middleware.py 。該模組包含了一個 Django 中介軟體類——CsrfMiddleware ,該類實現了 CSRF 防護功能。
在設定檔案中將 'django.contrib.csrf.middleware.CsrfMiddleware' 新增到 MIDDLEWARE_CLASSES 設定中可啟用 CSRF 防護。 該中介軟體必須在 SessionMiddleware 之後 執行,因此在列表中 CsrfMiddleware 必須出現在SessionMiddleware 之前 (因為響應中介軟體是自後向前執行的)。 同時,它也必須在響應被壓縮或解壓之前對響應結果進行處理,因此 CsrfMiddleware 必須在 GZipMiddleware 之後執行。一旦將它新增到MIDDLEWARE_CLASSES設定中,你就完成了工作。