问题

大家知道,在大前端领域,有一种叫做ajax的东东,即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),它被用来在不刷新页面的情况下,提交和请求数据。当没有<form>元素时,也就是如果Django服务器接收的是一个通过ajax发送过来的POST请求的话,那么将很麻烦,何也?因为只要有<form>元素就可以直接携带{% csrf_token %}令牌,但是,在没有<form>元素情况下,ajax没办法像<form>元素那样携带{% csrf_token %}令牌。那怎么办呢?好办!

方法一(用在js文件中)

在你的前端模版的JavaScript代码处,添加下面的代码:

/****************** BEGIN ******************/
// 官方提供的js文件ajax携带CSRF令牌的方法(使用jQuery库),参考官网https://docs.djangoproject.com/zh-hans/2.0/ref/csrf/ //***** 第一步:获取CSRF令牌 *****//
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;
}
var csrftoken = getCookie('csrftoken');

//***** 第二步:在ajax请求上设置CSRF令牌 *****//
function csrfSafeMethod(method) {
// 这些HTTP方法不要求携带CSRF令牌。test()是js正则表达式方法,若模板匹配成功,则返回true
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
/****************** END ******************/

上面代码的作用就是让你的ajax的POST方法带上CSRF需要的令牌,它依赖jQuery库,必须提前加载jQuery。这也是Django官方提供的解决方案,请参考。

方法二(用在HTML文件中)

简单快捷的解决办法,示例如下。

$.ajax({
type: "POST", // POST方法
url: "{% url 'oper:course_add_comment' %}", // 处理请求的url
data: {'course_id': {{ course_id }}, 'comment': comment},
async: true,
cache: false,
beforeSend: function (xhr, settings) {
xhr.setRequestHeader("X-CSRFToken", "{{ csrf_token }}"); // 重点是这里! 注意{{ csrf_token }}必须加上引号!
},
success: function (data) { // 请求成功后,视图传回的数据
if (data.status == 'fail') {
if (data.msg == '用户未登录') {
alert("您还未登录,不能评论!点击右上角登录按钮进行登录。");
} else {
alert(data.msg)
} } else if (data.status == 'success') {
alert(data.msg);
location.reload(); // 刷新当前页面
}
},
});

  至此,转载请注明出处。

本站相关链接:>>Django部署 ]

Django 如何让ajax的POST方法带上CSRF令牌的更多相关文章

  1. C#MVC通过AJAX调用API方法进行上传下载

    //这是写的一个类,具体是上传图片的上传和下载 public class FileResult    {        public int Code { get; set; }        pub ...

  2. 记得ajax中要带上AntiForgeryToken防止CSRF攻击

    经常看到在项目中ajax post数据到服务器不加防伪标记,造成CSRF攻击 在Asp.net Mvc里加入防伪标记很简单在表单中加入Html.AntiForgeryToken()即可. Html.A ...

  3. 切记ajax中要带上AntiForgeryToken防止CSRF攻击

    在程序项目中经常看到ajax post数据到服务器没有加上防伪标记,导致CSRF被攻击,下面小编通过本篇文章给大家介绍ajax中要带上AntiForgeryToken防止CSRF攻击,感兴趣的朋友一起 ...

  4. django设置并获取cookie/session,文件上传,ajax接收文件,post/get请求及跨域请求等的方法

    django设置并获取cookie/session,文件上传,ajax接收文件等的方法: views.py文件: from django.shortcuts import render,HttpRes ...

  5. 在Visualforce page中用自带的控件实现Ajax回调后台方法(并且可以用js去动态给parameters赋值)

    这里用的组合是:apex:commandLink  + apex:actionFunction + apex:outputPanel 这里的 apex:commandLink 和 apex:actio ...

  6. Python Django缓存,信号,序列化,文件上传,Ajax登录和csrf_token验证

    本节内容 models操作 Django的缓存 请求方式 序列化 Form 配合Ajax实现登录认证 上传文件 Ajax  csrf_token验证方式 1 models操作 单表查询: curd(增 ...

  7. Django JSON,AJAX

    JSON 概念 JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言 * JSON 具 ...

  8. django基础之Ajax、分页、cookie与session

    目录: Ajax之json Ajax简介 jquery实现的ajax js实现的ajax django分页器 COOKIE与SESSION 一.Ajax之json 1.什么是json? 定义: JSO ...

  9. 根据Django后台的ajax大全

    一.什么是ajax 1.1 什么是JSON? AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语 ...

随机推荐

  1. [Swift]LeetCode399. 除法求值 | Evaluate Division

    Equations are given in the format A / B = k, where A and B are variables represented as strings, and ...

  2. [Swift]LeetCode762. 二进制表示中质数个计算置位 | Prime Number of Set Bits in Binary Representation

    Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having a prime ...

  3. [Swift]LeetCode940. 不同的子序列 II | Distinct Subsequences II

    Given a string S, count the number of distinct, non-empty subsequences of S . Since the result may b ...

  4. linux配置jdk环境变量

    首先在Linux解压后缀为.tar.gz的jdk压缩文件 解压到当前的文件夹 tar -zcvf /root/java/jdk版本编号 指令: cd 目录路径     -> 是进入该目录路径 c ...

  5. java反射取private字段

    Class clazz = bean.getClass();Field[] fields = clazz.getDeclaredFields();String sign = ""; ...

  6. 用了 HTTPS 还不安全,问题就出在低版本 TLS 上

    HTTPS 加密时代已经来临,近两年,Google.Baidu.Facebook 等互联网巨头,不谋而合地开始大力推行 HTTPS, 2018 年 7 月 25 日,Chrome 68 上线,所有 H ...

  7. log4cplus使用(三)-日志重定向

    本文讲述的是log4cplus日志输出到qt widget,封装了serverSocket.     log4cplus支持用户自定义输出设备,只需要继承自Appender,或者Appender子类, ...

  8. CentOS 7 安装 Jenkins

    准备工作 首选需要安装JAVA环境 https://www.cnblogs.com/stulzq/p/9286878.html 如果你的系统没有自带git,那么也需要安装一个 yum install ...

  9. Quartz.NET学习笔记(三) 简单触发器

    触发器是Quartz.NET的另外第一个核心元素,他有2种类型,简单触发器(Simple Trigger)和计划任务触发器(Cron  Trigger), 一个触发器可以绑定一个任务. 通用触发器属性 ...

  10. Zend与PHP之间到底是什么关系

    Zend与PHP之间是什么关系 What is Zend's relationship with PHP? 每次看到PHP虚拟机中出现zend.zendvar之类的都很困惑,特意查了一下... PHP ...