2017-02-24 4 views
1

Ich versuche, eine Formulardaten an eine App mit AJAX zu senden.403 Verboten und request.method zeigt GET in django

Javascript Teil:

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 hat dieses

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" 

Formular Teil von HTML-Code ist:

<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> 

Ich habe das Javascript in HTML geladen. Ich bekomme 403 verboten Fehler und die request.method druckt GET.

Ich habe zwei Dinge zu fragen:

1). Warum erhält request.method GET, wenn es sich um eine POST-Anfrage handelt?

2). Warum bekomme ich immer noch 403 verbotenen Fehler, selbst nachdem ich csrf-Token gegeben habe?

Ich habe viel gesucht und diese versucht: @csrf_exempt über meine Sicht hinzufügen und es als from django.views.decorators.csrf import csrf_exempt importieren. Keine Verbesserung. Ich habe auch versucht, django.middleware.csrf.CsrfViewMiddleware von MIDDLEWARE Liste in meinem settings.py zu entfernen. Immer noch kein Fortschritt! Ich habe eine andere Frage hier. Bedeutet dies, dass Änderungen in settings.py nicht berücksichtigt werden? Jede Hilfe würde sehr geschätzt werden!

+0

Haben Neustart Sie Ihren Server nach Änderungen am Code? – Jingo

+0

Es wird jedes Mal neu gestartet, wenn es einen Codewechsel erkennt?! – phanny

Antwort

1

Sie können versuchen, diese

<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

Vielen Dank. Hat funktioniert ! – phanny

+0

Willkommen :) .... ... –

+0

Oh nein. Ich habe immer noch ein Problem. Es geht zum Fehler-Teil ('failure:' funktioniert nicht, ich denke es ist 'error:'). Was könnte der mögliche Fehler sein? – phanny

1

Sie müssen etwas in JavaScript tun, um das csrf-Token korrekt zu setzen. Es muss nicht einen Teil der Daten, sondern der Request-Header

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); 
     } 
    } 
}); 

In django Sie brauchen keine csrf_exempt wie der obigen Code zu tun, wird die CSRF-Token in jeden Ajax-Request injiziert, falls erforderlich . (Es gibt einen sehr guten Grund, warum CSRF es so ist es am besten, es nicht zu befreien)

+0

Danke ..... :) – phanny