Podría usar un poco de ayuda para cumplir con el mecanismo de protección CSRF de Django a través de mi publicación AJAX. He seguido las instrucciones aquí:
http://docs.djangoproject.com/en/dev/ref/contrib/csrf/
Copié exactamente el código de muestra AJAX que tienen en esa página exactamente:
http://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax
Puse una alerta imprimiendo el contenido de getCookie('csrftoken')
antes de la xhr.setRequestHeader
llamada y de hecho está poblada con algunos datos. No estoy seguro de cómo verificar que el token sea correcto, pero me alienta que encuentre y envíe algo.
Pero Django sigue rechazando mi publicación AJAX.
Aquí está mi JavaScript:
$.post("/memorize/", data, function (result) {
if (result != "failure") {
get_random_card();
}
else {
alert("Failed to save card data.");
}
});
Aquí está el error que estoy viendo de Django:
[23 / Feb / 2011 22:08:29] "POST / memorizar / HTTP / 1.1" 403 2332
Estoy seguro de que me falta algo, y tal vez sea simple, pero no sé qué es. He buscado alrededor de SO y vi información sobre cómo desactivar la verificación CSRF para mi vista a través del csrf_exempt
decorador, pero me parece poco atractivo. Lo probé y funciona, pero prefiero que mi POST funcione de la manera en que Django fue diseñado para esperarlo, si es posible.
En caso de que sea útil, aquí está la esencia de lo que está haciendo mi punto de vista:
def myview(request):
profile = request.user.profile
if request.method == 'POST':
"""
Process the post...
"""
return HttpResponseRedirect('/memorize/')
else: # request.method == 'GET'
ajax = request.GET.has_key('ajax')
"""
Some irrelevent code...
"""
if ajax:
response = HttpResponse()
profile.get_stack_json(response)
return response
else:
"""
Get data to send along with the content of the page.
"""
return render_to_response('memorize/memorize.html',
""" My data """
context_instance=RequestContext(request))
Gracias por tus respuestas!