2017-03-24 119 views
1

我收到一个只在我的服务器上的生产模式下发生的CSRF_Token错误。但是,当我使用runserver命令从计算机终端运行它时,一切正常。我已阅读了许多与此有关的其他问题,但没有运气。看起来,我的情况与其他情况稍有不同,因为它在本地工作,但不在生产中。Django CSRF令牌只在生产中丢失

提交提交给views.py中的“submit”的Ajax表单时出现错误。有谁知道可能是什么原因造成的?另外,在Production模式下查看我的cookie,CSRF_Token甚至不在那里开始。本地它是。谢谢你的帮助。

这里是我的views.py

from django.shortcuts import render 

from django.http import HttpResponse 


def index(request): 

    return render(request, 'index.html') 


def submit(request): 
    #Receive Request 
    inputone = request.POST['randominfo'] 
    inputtwo = request.POST['randominfo2'] 

    #Some more code here that setups response. 
    #Deleted since Im posting to StackOverflow 

    return response 

代码用于修饰阿贾克斯提交

$(function() { 
    $.ajaxSetup({ 
     headers: { "X-CSRFToken": getCookie("csrftoken") } 
    }); 
}); 

function getCookie(c_name) 
{ 
    if (document.cookie.length > 0) 
    { 
     c_start = document.cookie.indexOf(c_name + "="); 
     if (c_start != -1) 
     { 
      c_start = c_start + c_name.length + 1; 
      c_end = document.cookie.indexOf(";", c_start); 
      if (c_end == -1) c_end = document.cookie.length; 
      return unescape(document.cookie.substring(c_start,c_end)); 
     } 
    } 
    return ""; 
} 
function submitAjax(event){ 

     $.ajax({ 
      type:'POST', 
      url:'/submit/', 
      data:{ 
       randominfo:document.getElementById('Random').innerHTML, 
       randominfo2:document.getElementById('Random2').innerHTML, 

      }, 
      dateType: 'json', 
      success:function() { 
        # Url here 

      } 

     }) 
    }; 

解决方案是固定的这个问题。

“从django.views.decorators.csrf进口ensure_csrf_cookie”在views.py然后在查看上述“@ensure_csrf_cookie”返回包含ajax的形式

+0

为什么不干脆把'{%csrf_token%}'到您的模板直接,而不是试图把它弄出来的饼干? –

+0

那是我没有尝试过的一件事。生病报告回来。谢谢 –

回答

1

错误ocurs因为你的HTML文件中添加不设置CSRF令牌,以防止这一点,我们必须要检查一些细节

首先,您必须将CSRF令牌设置为你的表格,在您的HTML,你必须设置一些如下:

<form id="id" name="form"> 
    {% csrf_token %} 
    <!-- Form body here --> 
</form> 

第二种设置方法ËCSRF cookie来您的请求头是好的,我只是建议,而不是你一个,使用方法设置你的数据字段一个的jQuery serialize

data: $("#your-form-id").serialize()

我想推荐你读这post关于Ajax Django的要求,这是非常有帮助的

0

有两件事情可以做:

1)提交CSRF令牌在ajax调用。你必须使用一个getCookie() javascript函数来获取它。幸运的是,您可以复制和粘贴django文档has some code。 的JavaScript

$.ajax({ 
     type:'POST', 
     url:'/submit/', 
     data:{ 
      randominfo:document.getElementById('Random').innerHTML, 
      randominfo2:document.getElementById('Random2').innerHTML, 
      'csrfmiddlewaretoken': getCookie('csrftoken'), // add this 
... 

2)禁用CSRF你/提交视图。你可以用装饰器来做到这一点。请注意,这不太安全,因此请确保没有机密数据。

views.py:

from django.views.decorators.csrf import csrf_exempt 
... 
@csrf_exempt 
def your_submit_view(request): 
    #view code 
相关问题