Django到了1.2.5版本以上,Ajax POST请求的使用发生了一些改变,我们还记得前些版本1.2,Django加入了CSRF机制,大大增强了网络请求的安全性,正是因为这点,现在的Django对页面任何POST请求的数据进行跨域攻击保护。当你升级到1.2.5或更高版本后,你会发现以前1.2.4版本的Ajax POST脚本方法都不能用或者出错了,Django官网上提供了一个解决办法,加个JQuery ajaxSend事件,让你以前的Ajax Post脚本能重新正常使用起来。请看代码:
$('html').ajaxSend(function(event, xhr, settings) {
function getCookie ( name ) {
var cookieValue = null ;
if ( document . cookie && document . cookie != '' ) {
var cookies = document . cookie . split ( ';' );
for ( var i = ; i < cookies . length ; i ++ ) {
var cookie = jQuery . trim ( cookies [ i ]);
// Does this cookie string begin with the name we want?
if ( cookie . substring ( , name . length + 1 ) == ( name + '=' )) {
cookieValue = decodeURIComponent ( cookie . substring ( name . length + 1 ));
break ;
}
}
}
return cookieValue ;
}
if ( ! ( /^http:.*/ . test ( settings . url ) || /^https:.*/ . test ( settings . url ))) {
// Only send the token to relative URLs i.e. locally.
xhr . setRequestHeader ( "X-CSRFToken" , getCookie ( 'csrftoken' ));
}
});
把以上的代码 放在你使用Ajax POST 请求的页面上。
参考文档:
http://docs.djangoproject.com/en/dev/ref/contrib/csrf/#csrf-ajax
http://docs.djangoproject.com/en/dev/releases/1.3/#csrf-exception-for-ajax-requests
转载需注明:baoyalv 原创文章 http://2goo.info/blog/baoyalv/Django/2011/03/12/509