30_Django中关于使用ajax发送请求中`csrf_token`的问题和解决

目录

  • Django中关于csrf_token的问题和解决

    • 1. 在form表单中加上{% csrf_token %}
    • 2. 使用装饰器的方法,可以不用在form表单中添加上{% csrf_token %}
    • 3. 使用中间件,为每个请求都获取到token (使用这个方法,所有的表单都不需要在form标签中添加上{% csrf_token %} 了)

Django中关于csrf_token的问题和解决

在需要发送POST请求的html文件中引入下面的js代码, 我为其命名为get_csrf_token.js, 我下面的几个处理都需要使用到这一js代码文件

$(() => {
    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 = cookies[i].trim();
                // 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));
    }
    $.ajaxSetup({
        beforeSend: function(xhr, settings) {
            if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
            }
        }
    });

});

1. 在form表单中加上{% csrf_token %}

2. 使用装饰器的方法,可以不用在form表单中添加上{% csrf_token %}

(当然了这种方法与上面在每个form表单中添加上csrf_token 没有什么区别,都是只针对单个的)

from django.utils.decorators import method_decorator
from django.views.decorators.csrf import ensure_csrf_cookie

class LoginView(View):
    """
    登录
    url: /user/login/
    """
    @method_decorator(ensure_csrf_cookie)   # 获取csrf_token值
    def get(self, request):
        """
        响应登录get请求
        返回登录页面
        """
        return render(request, 'user/login.html')

    def post(self, request):
        """
        登录功能
        :param request:
        :return:
        """
        pass

3. 使用中间件,为每个请求都获取到token (使用这个方法,所有的表单都不需要在form标签中添加上{% csrf_token %} 了)

  1. 定义一个中间件
# 文件路径,如为: utils/my_middleware.py
from django.utils.deprecation import MiddlewareMixin
from django.middleware.csrf import get_token

class GetCsrfTokenMiddleware(MiddlewareMixin):
    def process_request(self, request):
        """执行视图之前被调用,在每个请求上被调用"""
        get_token(request)
  1. 在settings.py 中找到 MIDDLEWARE, 注册中间件
# 中间件
MIDDLEWARE = [
    ...
    'utils.my_middleware.GetCsrfTokenMiddleware'
    # '中间件文件路径.中间件文件名.定义的中间件类'
]

原文地址:https://www.cnblogs.com/nichengshishaonian/p/11631614.html

时间: 2024-11-05 22:37:30

30_Django中关于使用ajax发送请求中`csrf_token`的问题和解决的相关文章

spring MVC 管理HttpClient---实现在java中直接向Controller发送请求

在spring MVC中,大多数时候是由客户端的页面通过ajax等方式向controller发送请求,但有时候需要在java代码中直接向controller发送请求,这时可以使用HttpCilent实现. 首先用到的包是httpclient-4.3.5.jar和httpcore-4.3.2.jar 先看下面代码: package module.system.common; import java.io.IOException; import java.util.ArrayList; import

用Retrofit发送请求中添加身份验证

用Retrofit发送请求中添加身份验证====================在安卓应用开发中, retrofit可以极大的方便发送http网络请求,不管是GET, POST, 还是PUT, DELETE, Retrofit使用起来都非常简单.只要稍微看一下文档,就知道怎么用.但文档没有具体说明怎么怎么发送带auth信息的请求.本文分享两个代码片段. 比如要发送这样的请求,在header中添加身份验证信息,用户名和密码: http -a user1:user1password POST htt

Ajax发送请求

1,什么是ajax? Asynchronous JavaScript and XML(当然现在xml已经由json代替): 主要是用于前后台的交互(表单提交已经被废弃): 使用场景:前台获取数据.表单的失焦验证: 2,如何在有服务的环境下使用ajax发送请求 1.创建ajax对象-xmlhttprequest对象:(分为两种类型) 在新版本的浏览器中:variable=new XMLHttpRequest(); 老版本的IE中:variable=new ActiveXObject("Micros

ajax对象。同步与异步及ajax发送请求

ajax对象的属性.方法 属性 readyState: Ajax状态码 * 0:表示对象已建立,但未初始化,只是 new 成功获取了对象,但是未调用open方法 1:表示对象已初始化,但未发送,调用了open方法,但是未调用send方法 2:已调用send方法进行请求 3:正在接收数据(接收到一部分),客户端已经接收到了一部分返回的数据 4:接收完成,客户端已经接收到了所有数据 * status :http响应状态码 200代表成功获取服务器端数据 404未找到页面等等…… statusText

AJAX POST请求中參数以form data和request payload形式在servlet中的获取方式

HTTP请求中,假设是get请求,那么表单參数以name=value&name1=value1的形式附到url的后面,假设是post请求,那么表单參数是在请求体中,也是以name=value&name1=value1的形式在请求体中.通过chrome的开发人员工具能够看到例如以下(这里是可读的形式,不是真正的HTTP请求协议的请求格式): get请求: RequestURL:http://127.0.0.1:8080/test/test.do?name=mikan&address=

AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式

HTTP请求中,如果是get请求,那么表单参数以name=value&name1=value1的形式附到url的后面,如果是post请求,那么表单参数是在请求体中,也是以name=value&name1=value1的形式在请求体中.通过chrome的开发者工具可以看到如下(这里是可读的形式,不是真正的HTTP请求协议的请求格式): get请求: RequestURL:http://127.0.0.1:8080/test/test.do?name=mikan&address=str

Play framework框架中通过post方式发送请求

搞了好久这个最终还是在play官方文档中看见的发送请求的方式,国内好像很少有使用这个框架的,加之自己不是太愿意宣传,好东西总归是好东西,不说废话了. 在play中发送请求有两种常用的方式,一种get,一种post,当然,这里说的发送请求都是向第三方站点发送请求,而不是内部发送,内部当然不需要通过这种方式了. get方式: WS.url("url").setQueryParameter(arg0, arg1)..setQueryParameter(arg0, arg1).get(); 而

转:PHP中的使用curl发送请求(GET请求和POST请求)

原文地址:http://www.jb51.net/article/104974.htm 使用CURL发送请求的基本流程 使用CURL的PHP扩展完成一个HTTP请求的发送一般有以下几个步骤: 1.初始化连接句柄: 2.设置CURL选项: 3.执行并获取结果: 4.释放VURL连接句柄. 下面的程序片段是使用CURL发送HTTP的典型过程: // 1. 初始化 $ch = curl_init(); // 2. 设置选项,包括URL curl_setopt($ch,CURLOPT_URL,"http

服务器获取浏览器发送请求中的cookies,选取自己需要的cookie

String cookieName = “userID”; // 设置自己需要的cookie名 Cookie cookies[] = request.getCookies(); // 获取请求中的所有cookie if (cookies!=null) { for(int i=0;i<cookies.length;i++) // 遍历 { Cookie cookie = cookies[i]; if (cookieName.equals(cookie.getName())) doSomething