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)
 
时间: 2024-08-16 00:44:21

django-ajax之post方式的相关文章

Django ajax MYSQL Highcharts&lt;1&gt;

Another small project with django/Ajax/Mysql/Highcharts. 看下效果图  - delivery dashboard .嘿嘿 是不是还蛮好看的. 废话不多说.在过程中遇到的问题总结: 1. Ajax URL 请求403 错误: 是由于CSRF(Cross-site request forgery跨站请求伪造请求保护)的原因.目前有三种方法 1.1 我使用的是@csrf_exempt加在相应的view前,但是这样不安全,是关闭csrf保护功能.

Django &amp; Ajax Part01

背景需求分析 使用Django+Ajax的背景情景,当用户填写一个非常详细的注册申请表的时候!用户最担心的事情应该是填表期间被人打扰,其次是希望填完表提交以后千万别出现什么差错,否则又得从新来过!因此,我们首先想到的可能会是使用Ajax来处理.Ajax的介绍通常都是基于PHP后台的编写模式,我自己从没用过PHP写过服务器,所以找工作对我来说都是一场噩梦啊! 开发环境准备 这里我将会完整的演示如何建立以及配置我们的django环境,以后我们写的各种代码如果不特别说明都是基于这个项目环境上完成的!

Django ajax Post

在web项目中,ajax运用非常频繁,今天就给大家展示下Django ajax Post的使用方法 templates 模板--------------------- index.html <html> <header></header> <body> <p>name: <input type="text" name="nickname" /></p> <input class

Django使用自定义认证方式

Django使用自定义认证方式 创建登录应用 首先创建一个新的login app,用来存放认证用到代码 python manage.py startapp login 修改settings.py中的认证项 AUTHENTICATION_BACKENDS = ( 'login.auth.UsernamePasswordAuth', ) 自定义认证类 在login app下创建auth.py文件,内容如下 #coding:utf-8 from django.contrib.auth.models i

ASP.NET 与 Ajax 的实现方式

Ajax 应该不是一项技术,是一种思想而已,跟 ASP.NET 以及其它 Web 开发语言没有什么太大关系,这里只是谈谈 ASP.NET 中目前使用的 Ajax 技术以及其它一些实现 Ajax 的优秀框架. Ajax 已经很流行一阵子了,现在谈 Ajax 觉得有点老土,-_____-```.目前所谓的 Web2.0 网站,基本上没有不使用 Ajax 的,就如使用 RSS 一样,就如同一个标签,贴上去就成了 2.0.Ajax 具体细节不谈,其目的就是让用户触发一些操作的时候,页面不会全部刷新,只刷

django+ajax实现在线聊天室

django+ajax实现在线聊天室 小项目中的一个,就是简单的聊天室 需求: 注册登陆之后才能发言 初始在聊天框中展示最近的消息 发送消息使用ajax,在后台完成消息的存储 使用轮循不断请求get新消息展示在聊天框中 Models 设计聊天消息主题的结构: class Chat(models.Model): sender = models.ForeignKey(User, related_name='has_chats') content = models.TextField() time =

Django+ajax实现页面底部加载

Django+ajax实现页面底部加载 需求:展示图片,当滚动条拖到页面底部时加载一部分图画. 问题:photo的展示使用的是django的QuerySet,对于ajax如何加载非常头痛,还专门补了一下js. 解决思路:用的取巧的办法,把photo先分页,然后ajax的load方法加载下一个页面的photo部分到当前页面来. 分页 第一步是把photo的QuerySet分页展示,我这里直接用127.0.0.1:8000/x/的url,所以在urls.py里这样写 url(r'^(?P<page>

jQuery Ajax url使用方式

jQuery Ajax的使用场景: 页面需要通过后台逻辑,但只需要局部刷新以显示新的内容. jQuery Ajax url使用方式1.servlet方式: 需要在struts.xml中写一个action,跳转地址写servlet; 需要重写init方法(为了使用spring注入的bean); 设置响应编码response.setContentType("text/html; charset=UTF-8"); 使用request.getParameter()接收参数; 使用respons

前端ajax用post方式提交json数据给后端时,网络报错 415

项目框架:spring+springmvc+mybatis 问题描述:前端ajax用post方式提交json数据给后端时,网络报错 415 前端异常信息:Failed to load resource: the server responded with a status of 415 (Unsupported Media Type) 后端异常信息:无 报错原因:缺少jackson包 类似问题注意点: springmvc添加配置.注解: pom.xml添加jackson包引用: Ajax请求时没

python学习-- Django Ajax CSRF 认证

使用 jQuery 的 ajax 或者 post 之前 加入这个 js 代码:http://www.ziqiangxuetang.com/media/django/csrf.js /*====================django ajax ======*/ jQuery(document).ajaxSend(function(event, xhr, settings) { function getCookie(name) { var cookieValue = null; if (doc