django csrf使用教程,解決Forbidden (403)CSRF verification failed. Request aborted.


Django版本號:1.11.15

django中post請求報錯:
Forbidden (403)
CSRF verification failed. Request aborted.

Help
Reason given for failure:
CSRF cookie not set.


方法1:不使用CSRF驗證
全站禁用(不推薦)
去掉settings.py中MIDDLEWARE中的django.middleware.csrf.CsrfViewMiddleware中間件
例如如下配置,去掉django.middleware.csrf.CsrfViewMiddleware即可
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

局部禁用(推薦)
或者在不想進行csrf保護的view可以加上@csrf_exempt
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def ajaxGetList(r):

方法2:使用CSRF驗證

form表單中添加
{% csrf_token %}

views.py代碼
from django.template.context_processors import csrf
from django.http import HttpResponse
from django.template import Context, loader

def my_view(request):
c = {}
c.update(csrf(request))
# ... view code here
return HttpResponse(loader.get_template('index.html').render(c))

舊版本的代碼:
from django.core.context_processors import csrf
from django.shortcuts import render_to_response
def my_view(request):
c = {}
c.update(csrf(request))
# ... view code here
return render_to_response("a_template.html", c)

js代碼
在發 ajax POST 請求時,加一個 X_CSRFTOKEN 的 header
// using jQuery
var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();
或者
var csrftoken = $.cookie('csrftoken');
代碼1:
function submitForm(){
var user = $('#user').val();
$.ajax({
url: '/csrf1.html',
type: 'POST',
headers:{'X-CSRFToken': csrftoken},
data: { "user":user},
success:function(arg){
console.log(arg);
}
})
}

代碼2:
// 去cookie中獲取值
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
function DoAjax(){
$.ajax({
url: '/csrf/',
type: 'POST',
data: {'k1': 'v1'},
success: function (data) {
console.log(data);
}
})
}

PS:
1.csrf 裝飾器
全局:
  中間件 django.middleware.csrf.CsrfViewMiddleware
局部:
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_protect,為當前函數強制設置防跨站請求偽造功能,即便settings中沒有設置全局中間件。
@csrf_exempt,取消當前函數防跨站請求偽造功能,即便settings中設置了全局中間件。
2.django建議使用django.middleware.csrf.CsrfViewMiddleware進行全局控制,不提倡使用@csrf_protect進行單view控制,因為這樣可能會有遺漏。如果不想進行csrf保護的view可以加上@csrf_exempt。 使用CSRF驗證:把django.core.context_processors.csrf加到配置文件的 TEMPLATE_CONTEXT_PROCESSORS,或者手動生成csrftoken並加到template context。
3.django1.11版csrf官方文檔:https://docs.djangoproject.com/en/1.11/ref/csrf/#django.views.decorators.csrf.csrf_protect


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM