zoukankan      html  css  js  c++  java
  • django ajax报错解决:You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set.

    Django版本号:1.11.15

    django中ajax请求报错:
    You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data.

    将from的action地址改为/结尾的就可以了
    或者
    修改settings:APPEND_SLASH=False

    修改之后提示

    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验证
    django1.11版csrf官方文档:https://docs.djangoproject.com/en/1.11/ref/csrf/#django.views.decorators.csrf.csrf_protect

    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。

  • 相关阅读:
    JS 深拷贝方法
    数字图像处理中的混叠
    RoIAlign理解
    关于python项目vscode 提示import could not be resolved的问题解决
    HTTPS网站证书申请,HTTPS的安全特性
    使用多域名SSL证书 一种免费的证书申请方式
    During secondary validation: DNS problem: query timed out looking up CAA for ***
    The Next Gen Database Servers Powering Let's Encrypt
    Jenkins 构建及回滚任务
    Go优雅追踪堆栈错误包
  • 原文地址:https://www.cnblogs.com/zqifa/p/django-ajax-1.html
Copyright © 2011-2022 走看看