zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    无废话网页重构系列——(7)样式、结构、行为分离分割
    无废话网页重构系列——(1)为什么要写这个系列
    无废话网页重构系列——(2)来套Web重构装备
    批处理系列(1) 基础
    无废话网页重构系列——(6)语义化
    无废话网页重构系列——(4)切图与标注
    Media Queries 媒体查询常见设备断点
    无废话网页重构系列——(9)栅格结构
    无废话网页重构系列——(5)搭建工程目录
    初识python之python基本语法(1)
  • 原文地址:https://www.cnblogs.com/zqifa/p/django-csrf-1.html
Copyright © 2011-2022 走看看