• django csrf使用教程,解决Forbidden (403)CSRF verification failed. Request aborted.


    Django版本号:1.11.15

    django中post请求报错:
    Forbidden (403)
    CSRF verification failed. Request aborted.

    Help
    Reason given for failure:
    CSRF cookie not set.


    方法1:不使用CSRF验证
    全站禁用(不推荐)
    去掉settings.py中MIDDLEWARE中的django.middleware.csrf.CsrfViewMiddleware中间件
    例如如下配置,去掉django.middleware.csrf.CsrfViewMiddleware即可
    MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]

    局部禁用(推荐)
    或者在不想进行csrf保护的view可以加上@csrf_exempt
    from django.views.decorators.csrf import csrf_exempt

    @csrf_exempt
    def ajaxGetList(r):

    方法2:使用CSRF验证

    form表单中添加
    {% csrf_token %}

    views.py代码
    from django.template.context_processors import csrf
    from django.http import HttpResponse
    from django.template import Context, loader

    def my_view(request):
    c = {}
    c.update(csrf(request))
    # ... view code here
    return HttpResponse(loader.get_template('index.html').render(c))

    旧版本的代码:
    from django.core.context_processors import csrf
    from django.shortcuts import render_to_response
    def my_view(request):
    c = {}
    c.update(csrf(request))
    # ... view code here
    return render_to_response("a_template.html", c)

    js代码
    在发 ajax POST 请求时,加一个 X_CSRFTOKEN 的 header
    // using jQuery
    var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();
    或者
    var csrftoken = $.cookie('csrftoken');
    代码1:
    function submitForm(){
    var user = $('#user').val();
    $.ajax({
    url: '/csrf1.html',
    type: 'POST',
    headers:{'X-CSRFToken': csrftoken},
    data: { "user":user},
    success:function(arg){
    console.log(arg);
    }
    })
    }

    代码2:
    // 去cookie中获取值
    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", csrftoken);
    }
    }
    });
    function DoAjax(){
    $.ajax({
    url: '/csrf/',
    type: 'POST',
    data: {'k1': 'v1'},
    success: function (data) {
    console.log(data);
    }
    })
    }

    PS:
    1.csrf 装饰器
    全局:
      中间件 django.middleware.csrf.CsrfViewMiddleware
    局部:
    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
    @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
    2.django建议使用django.middleware.csrf.CsrfViewMiddleware进行全局控制,不提倡使用@csrf_protect进行单view控制,因为这样可能会有遗漏。如果不想进行csrf保护的view可以加上@csrf_exempt。 使用CSRF验证:把django.core.context_processors.csrf加到配置文件的 TEMPLATE_CONTEXT_PROCESSORS,或者手动生成csrftoken并加到template context。
    3.django1.11版csrf官方文档:https://docs.djangoproject.com/en/1.11/ref/csrf/#django.views.decorators.csrf.csrf_protect

  • 相关阅读:
    List集合
    类加载机制
    代码优化
    JVM字节码
    Tomcat优化之Apache Jmeter压力测试工具
    Tomcat优化
    JVM垃圾收集器
    lambda表达式
    java 内部类
    java多线程3种方式
  • 原文地址:https://www.cnblogs.com/zqifa/p/django-csrf-1.html
Copyright © 2020-2023  润新知