utilizando django 1.4 im obteniendo un error 403 cuando intento hacer un post de mi javascript hacer mi django servidor. mi funciona bien a pesar de que el problema es sólo con el post. también trató de @csrf_exempt sin suerte

ACTUALIZACIÓN: me pueden enviar ahora que he añadido {% csrf_token %} , pero el post de respuesta viene vacío, aunque el CONSEGUIR que viene correctamente, alguna idea?

mi django vista:

@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')

aquí está mi código 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)
});

también he probado desde el sitio sin suerte :

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

lo que me estoy perdiendo?

¿Set DEBUG = True? Ir a Chrome Dev Herramientas -> Red y haga clic en su error de la solicitud. ¿Qué mensaje te metes en la vista previa o la Respuesta de la ficha?
me sale un «CSRF error en la comprobación. Solicitud abortado.»
extrañamente ahora mi post de respuesta viene VACÍO, alguna idea de por qué? el conseguir todavía funciona muy bien
stackoverflow.com/a/30210391/940098

OriginalEl autor psychok7 | 2012-10-23

3 Comentarios

  1. 25

    puede pasar esto, junto con sus datos {csrfmiddlewaretoken:'{{csrf_token}}’ } , funciona todo el tiempo

    El nombre del token debe ser «csrfmiddlewaretoken», en lugar de «csrftoken». (Django 1.4)

    OriginalEl autor Muhia NJoroge

  2. 6

    En mi caso que tengo una plantilla en la que no quiero tener un <form></form> elemento. Pero todavía quiero hacer AJAX peticiones POST usando jQuery.

    Tengo errores 403, debido a CSRF cookie siendo nulo, aunque he seguido el django docs (https://docs.djangoproject.com/en/1.5/ref/contrib/csrf/). La solución está en la misma página, mencionando el ensure_csrf_cookie decorador.

    Mi CSRF cookie hizo establecerá cuando he añadido esta en la parte superior de mi views.py:

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

    También, por favor, tenga en cuenta que en este caso se no necesita el elemento DOM en el marcado /plantilla: {% csrf_token %}

    Gracias! Tuve que usar el siguiente antes de que mi definición de clase como yo era el uso de la clase basada en puntos de vista: @method_decorator(ensure_csrf_cookie, nombre=’actualizar’)

    OriginalEl autor woohoo

  3. 4

    tengo trabajo mediante la adición de {% csrf_token %} en algún lugar dentro del formulario en mi plantilla

    csrf_token es un anti cross-site-solicitud-falsificación (en.wikipedia.org/wiki/Cross-site_request_forgery) que el token, y es necesario porque ‘django.middleware.csrf.CsrfViewMiddleware’ se define en la MIDDLEWARE_CLASSES sección de su settings.py.

    OriginalEl autor psychok7

Dejar respuesta

Please enter your comment!
Please enter your name here