今天在尝试调用jQuery的ajax时发现一个问题,就是使用GET方法服务器可以正常返回,但是使用POST方法却不行。后来再测试表单方式的POST的方法也不行。只要POST必报HTTP 403错误!非常奇怪。。。
在网上搜了一大堆资料以后原来是因为Django的Cross Site Request Forgery protection机制的问题。这个机制是为了保护不受csrf攻击。解决方案Django的官网已经提供了http://docs.djangoproject.com/en/dev/ref/contrib/csrf/,根据说明修改后,ajax可以顺利Post了。
具体办法是,首先解决表单的POST。在settings.py文件中找到 MIDDLEWARE_CLASSES,在其中加入一个中间件:'django.middleware.csrf.CsrfViewMiddleware' ,修改后的代码如下:
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.csrf.CsrfResponseMiddleware', #加入这个中间件
)
经过这番修改,可以解决表单方式的POST提交HTTP 403问题了。ajax的Post提交仅这样改还不行。还需要钩上一个每次提交时的cookie处理过程。也就是每次提交的时候,都触发这个过程,在提交的http头上加入csrf token。不过还好,如果你是用jQuery来处理ajax的话,Django直接送了一段解决问题的代码。把它放在一个独立的js文件中,在html页面中都引入即可。注意这个js文件必须在jquery的js文件引入之后,再引入。代码我直接复制过来了,如下:
$('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 = 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;
}
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与Django通信了。
分享到:
相关推荐
但使用Django框架时,常常会遇到一个问题:使用GET方法可以正常工作,但POST方法却无法成功提交数据,返回HTTP403错误。这个问题通常与Django的跨站请求伪造保护(Cross-Site Request Forgery Protection,简称CSRF ...
项目概述:本项目是基于Python中流行的Django框架,结合jQuery AJAX技术实现的前后端交互应用。通过使用POST和GET请求,实现了数据的异步处理。项目主要采用Python语言编写,同时包含了JavaScript、HTML、Shell、CSS...
在使用Django框架进行Web开发时,Ajax技术常被用于实现页面无刷新更新,提高用户体验。然而,在使用Ajax向Django后端发送POST请求时,可能会遇到403 Forbidden错误,提示“CSRF token missing or incorrect.”。这个...
本文将详细讲解如何在Django框架下利用Ajax实现数据的动态更新。 首先,我们需要理解Django和Ajax的基本概念。Django是一个Python Web框架,用于快速构建安全、可维护的网站。而Ajax(Asynchronous JavaScript and ...
在本文中,我们将深入探讨Django框架中使用Ajax进行异步请求的相关知识。Ajax(Asynchronous JavaScript and XML)技术允许Web应用在不刷新整个页面的情况下与服务器交换数据并更新部分网页内容,极大地提升了用户...
用过Django 进行开发的同学都知道,Django框架天然支持对CSRF攻击的防护,因为其内置了一个名为CsrfViewMiddleware的中间件,其基于Cookie方式的防护原理,相比基于session的方式,更适合目前前后端分离的业务场景。...
该项目是一款基于Django框架和Ajax技术的Web应用源码,总计包含185个文件,涵盖了91个JavaScript文件、20个Python源代码文件、20个Python字节码文件、15个HTML文件、12个CSS文件、8个JavaScript源码映射文件、4个XML...
【标题】:基于Django框架,使用Django REST framework实现前后端分离的网上图书商店 【描述】:这个项目是一个采用Python的Django框架和Django REST framework构建的网上图书商店,实现了完整的前后端分离。它展示...
使用Django的`post_save`信号处理程序或自定义管理命令,确保数据更改时同步到Elasticsearch。 6. 用户界面:在Django视图中实现搜索功能,接收用户查询,调用Elasticsearch查询API,返回结果。在模板中展示搜索...
在Django框架中使用jQuery的AJAX POST方法传输数据时,有时会遇到403错误。这种错误通常是由于Django的CSRF(Cross-Site Request Forgery)保护机制引发的。CSRF是一种防止跨站请求伪造的机制,为了安全地保护web...
在本文中,我们将深入探讨如何在Django框架中与前端使用Ajax进行JSON数据的传输。Ajax(Asynchronous JavaScript and XML)是一种在不刷新整个页面的情况下更新部分网页的技术,而JSON(JavaScript Object Notation...
在Python的Web开发框架Django中,Form表单是处理用户输入数据的重要工具。它不仅提供了数据验证功能,还能帮助我们构建美观的HTML表单。本教程将详细讲解Django的Form表单验证以及如何结合Ajax实现无刷新验证。 ...
在使用Django框架进行Web开发时,经常需要通过AJAX发送POST请求以实现异步数据交互。本文将详细介绍在Django中如何通过AJAX发送POST请求的两种方法,这两种方法分别涉及到表单中的CSRF Token的使用以及在AJAX请求中...
**基于Django框架的博客应用** Django是一个高级的Python Web框架,它鼓励快速开发和清洁、实用的设计。在这个例子中,我们看到一个基于Django的博客应用的实现。Django提供了模型-视图-控制器(MVC)的架构模式,...
《Django JavaScript Integration AJAX and jQuery》这本书深入探讨了如何将Django框架与JavaScript技术(包括AJAX和jQuery)进行有效集成,以构建现代化的Web应用。本书不仅适合已经熟悉Django框架并希望进一步提升...
在Django框架中,使用Ajax可以实现前端与后端的异步交互,提高用户体验,而CSRF(Cross-site request forgery,跨站请求伪造)验证是Django为了防止恶意第三方模拟用户发送请求的一种安全机制。然而,有些情况下,...