2017-03-24 92 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 
相關問題