django-ajax之post方式


post方式不同於get方式可以被django直接得到,因為django為post加入了csrf保護,  詳細的文檔地址https://docs.djangoproject.com/en/dev/ref/csrf/

注釋:在最新版本中,在setting.py里'django.middleware.csrf.CsrfViewMiddleware',默認是使用中的,如果沒有請自行添加,並且確保此引用在其他所有viewware前面

 

MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',//this line is vsrf 
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django_cas.middleware.CASMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

 

如果想避過csrf檢測這一層直接使用post的話,有幾種方法:

1 需要在views.py里要出發post請求的函數前加入@csrf_exempt ,之前要引入from django.views.decorators.csrf import csrf_exempt

2 在 settings.py 中 MIDDLEWARE_CLASSES 中 注釋掉'django.middleware.csrf.CsrfViewMiddleware'

 

說下正確使用csrf的方法 :

對於ajax.post方法,需要在ajax方法觸發前加入一段js,這段我理解是用來生成不同的token,但是很好奇如果禁掉了cookie會怎樣我沒研究.

 

function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

ajax方法 :

$.ajax({
url: "ticket/operation/?action=get_vmlist",
data: { 'env': env, 'subenv': subenv },
type: "post",
dataType: 'json',
beforeSend: function (xhr, settings) {

//此處調用剛剛加入的js方法
var csrftoken = getCookie('csrftoken'); 
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
 
}
},
success: function (data) {
 
},
complete: function () {
 
},
error: function (er) {
 
}
});

view.py:

def ticket_handler(request):  

if request.method == 'POST':
  if request.GET['action'] == 'get_vmlist':
    try:

      d = {}  
      env = request.POST['env'] 

      print env //這里就可以看到env的值被正確傳遞給后台了

      d['Result'] = 'Fail'
      s = json.dumps(d)
      return HttpResponse(s)

btw:

可以顯示對單個view函數進行csrf保護,
from django.views.decorators.csrf import csrf_protect
@csrf_protect
def my_view(request): c = {} # ... return render(request, "a_template.html", c)
 


免責聲明!

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



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