2012-10-23 20 views
10

przy użyciu django 1.4 im uzyskanie błędu 403, gdy próbuję zrobić post z mojego javascript zrobić mój serwer django. mój program działa dobrze, ale problem dotyczy tylko wpisu. również wypróbowany @csrf_exempt bez powodzeniadjango ajax post 403 zabronione

AKTUALIZACJA: Mogę Opublikuj teraz, że dodałem {% csrf_token %}, ale odpowiedź na post jest pusta, mimo że GET przychodzi poprawnie, jakieś pomysły?

mój widok Django:

@csrf_protect 
def edit_city(request,username): 
    conditions = dict() 

    #if request.is_ajax(): 
    if request.method == 'GET': 
     conditions = request.method 

    elif request.method == 'POST': 
     print "TIPO" , request.GET.get('type','')  
     #based on http://stackoverflow.com/a/3634778/977622  
     for filter_key, form_key in (('type', 'type'), ('city', 'city'), ('pois', 'pois'), ('poisdelete', 'poisdelete'), ('kmz', 'kmz'), ('kmzdelete', 'kmzdelete'), ('limits', 'limits'), ('limitsdelete', 'limitsdelete'), ('area_name', 'area_name'), ('action', 'action')): 
      value = request.GET.get(form_key, None) 
      if value: 
       conditions[filter_key] = value 
       print filter_key , conditions[filter_key] 

     #Test.objects.filter(**conditions) 
    city_json = json.dumps(conditions) 

    return HttpResponse(city_json, mimetype='application/json') 

tutaj jest mój kod 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'); 

function csrfSafeMethod(method) { 
    // these HTTP methods do not require CSRF protection 
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 
} 
function sameOrigin(url) { 
    // test that a given url is a same-origin URL 
    // url could be relative or scheme relative or absolute 
    var host = document.location.host; // host + port 
    var protocol = document.location.protocol; 
    var sr_origin = '//' + host; 
    var origin = protocol + sr_origin; 
    // Allow absolute or scheme relative URLs to same origin 
    return (url == origin || url.slice(0, origin.length + 1) == origin + '/') || 
     (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') || 
     // or any other URL that isn't scheme relative or absolute i.e relative. 
     !(/^(\/\/|http:|https:).*/.test(url)); 
} 
$.ajaxSetup({ 
beforeSend: function(xhr, settings) { 
    if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { 
     // Only send the token to relative URLs i.e. locally. 
     xhr.setRequestHeader("X-CSRFToken", 
          $('input[name="csrfmiddlewaretoken"]').val()); 
    } 
} 
}); 

$.post(url,{ type : type , city: cityStr, pois: poisStr, poisdelete: poisDeleteStr, kmz: kmzStr,kmzdelete : kmzDeleteStr,limits : limitsStr, area_nameStr : area_nameStr , limitsdelete : limitsDeleteStr},function(data,status){ 
        alert("Data: " + data + "\nStatus: " + status); 
        console.log("newdata" + data.area_name) 
       }); 

Próbowałem również z witryny bez powodzenia:

$.ajaxSetup({ 
    beforeSend: function(xhr, settings) { 
     if (!csrfSafeMethod(settings.type) && sameOrigin(settings.url)) { 
      // Send the token to same-origin, relative URLs only. 
      // Send the token only if the method warrants CSRF protection 
      // Using the CSRFToken value acquired earlier 
      xhr.setRequestHeader("X-CSRFToken", csrftoken); 
     } 
    } 
}); 

Czego mi brakuje ?

+1

Czy ustawiłeś DEBUG = True? Przejdź do Chrome Dev Tools -> Sieć i kliknij swoją nieudaną prośbę. Jaką wiadomość otrzymasz na karcie Podgląd lub Odpowiedź? –

+0

Otrzymuję komunikat "Weryfikacja CSRF nie powiodła się. Żądanie przerwane." – psychok7

+0

co dziwne, moja odpowiedź na post jest PUSTA, każdy pomysł, dlaczego? nadal działa dobrze – psychok7

Odpowiedz

3

dostał pracę dodając {% csrf_token %} gdzieś w formularzu w moim szablonu

+0

csrf_token jest tokenem anti-site-for-falsyfikat (http://en.wikipedia.org/wiki/Cross-site_request_forgery), i jest wymagane, ponieważ "django.middleware.csrf.CsrfViewMiddleware" jest zdefiniowane w sekcji MIDDLEWARE_CLASSES w pliku settings.py. –

24

rzeczywiście można przekazać to wraz ze swoimi danymi {csrfmiddlewaretoken: '{{csrf_token}}}, to działa cały czas

+4

Nazwa tokena powinna być "csrfmiddlewaretoken" zamiast "csrftoken". (Django 1.4) –

6

W moim przypadku mam szablon, w którym nie chcę mieć elementu <form></form>. Ale nadal chcę tworzyć żądania POST AJAX przy użyciu jQuery.

mam 403 błędy, ze względu na CSRF cookies samopoczucia null, nawet jeśli następuje docs django (https://docs.djangoproject.com/en/1.5/ref/contrib/csrf/). Rozwiązanie jest na tej samej stronie, wspominając o dekoratorze ensure_csrf_cookie.

Moja CSRF cookies udało nam określić, kiedy dodałem to na szczycie mojej views.py:

from django.views.decorators.csrf import ensure_csrf_cookie 
@ensure_csrf_cookie 

Należy również pamiętać, że w tym przypadku nie trzeba elementu DOM w swojej znaczników/szablonu : {% csrf_token %}

+0

Dzięki! Musiałem użyć następujących elementów przed definicją klasy, ponieważ używałem widoków opartych na klasach: @method_decorator (ensure_csrf_cookie, name = 'update') – nbeuchat