2017-02-24 44 views
1

我試圖使用AJAX將表單數據發送到應用程序。403 Forbidden和request.method在django中顯示GET

JavaScript部分:

function submit_changes() { 
var all_data = [A_list, B_list,C_list] 
$.ajax({ 
    type: "POST", 
    url: "/my_url/", 
    contentType: "application/json", 
    //dataType: 'json', 
    //data:JSON.stringify(all_data), 
data:{ 
    csrfmiddlewaretoken: "{{ csrf_token }}",   
    form:JSON.stringify(all_data), 
}, 

    success: function() { 
     alert('Data captured successfully'); 
     //window.location.reload(); 
    }, 
    error: function(){ 
     alert('Error in data capture') 
     //window.location.reload(); 
    } 
}); 
} 

urls.py有這個

urlpatterns=[url(r'^my_url/$',views.my_url_fn)] 

views.py

def my_url_fn(request): 
    print "*** request is ***",request 
    if request.method == 'POST': 
     print "request is POST" 
     return Response(json.dumps(submit_changes(request))) 
    elif request.method == 'GET': 
     print "request is GET" 
     return Response(json.dumps(get_already_present_data()),mimetype='application/json') 
    else: 
     print "neither post nor get" 

組成部分,從HTML代碼:

<div align="center"> 
    <form name="myForm" onSubmit="return 0">{% csrf_token %}  
    <input type="text" id="blah1" placeholder="Blah1&hellip;"> 
     <!-- few more fields --> 
    </form> 
</div> 
<div align='center'> 
    <input id="submit_changes" type="button" align="middle" value="Submit Changes" onclick="submit_changes();" /> 
</div> 

我已經在html中加載了javascript。 我得到403禁止的錯誤和request.method打印GET。

我有兩件事情要問:

1)。爲什麼request.method是POST請求時獲取? 2)。爲什麼即使在給出csrf標記後,我仍然得到403禁止錯誤?

我尋覓了很多,嘗試這些:上面我的觀點添加@csrf_exempt和進口它作爲from django.views.decorators.csrf import csrf_exempt。沒提升。我也嘗試從我的settings.py中的MIDDLEWARE列表中刪除django.middleware.csrf.CsrfViewMiddleware。仍然沒有進展!我在這裏有另一個問題。這是否意味着settings.py中的更改沒有得到反映?任何幫助將不勝感激 !

+0

後請將代碼更改重新啓動您的服務器? – Jingo

+0

只要它檢測到代碼更改,它會自行重新啓動?! – phanny

回答

1

你可以試試這個

<script type="text/javascript"> 

    function getCookie(name) { 
     var cookieValue = null; 
     if (document.cookie && document.cookie !== '') { 
      var cookies = document.cookie.split(';'); 
      for (var i = 0; i < cookies.length; i++) { 
       var cookie = jQuery.trim(cookies[i]); 
       // Does this cookie string begin with the name we want? 
       if (cookie.substring(0, name.length + 1) === (name + '=')) { 
        cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
        break; 
       } 
      } 
     } 
     return cookieValue; 
    } 
    var csrftoken = getCookie('csrftoken'); 
    $(document).ready(function() { 
     $.ajax({ 
      type: 'post', 
      url: "{% url "url_to_view" %}", 
      headers: {"X-CSRFToken": csrftoken}, 
      data: {id: "something to view"}, 
      success: function (response) { 
       alert("success"); 
       }); 
      }, 
      failure: function (response) { 
       alert(response.d); 
      } 
     }); 
    }); 
</script> 
+1

非常感謝。工作! – phanny

+0

歡迎:) .... ... –

+0

哦,不,我仍然有問題。它的錯誤部分('失敗:'不工作,我認爲它的'錯誤:')。可能的錯誤是什麼? – phanny

1

您需要在JavaScript中這樣做才能正確設置csrf標記。它並不需要將數據的一部分,而是請求頭

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-CSRF-Token", CSRF_TOKEN); 
     } 
    } 
}); 

在Django,你不需要做csrf_exempt如上面的代碼將注入CSRF令牌到每一個Ajax請求,如果需要的話。 (有一個很好的理由,爲什麼CSRF是有那麼最好不要免除它)

+0

謝謝..... :) – phanny