Potrei usare un po 'di aiuto per conformarmi al meccanismo di protezione CSRF di Django tramite il mio post AJAX. Ho seguito le indicazioni qui:
http://docs.djangoproject.com/en/dev/ref/contrib/csrf/
Ho copiato esattamente il codice di esempio AJAX che hanno su quella pagina:
http://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax
Ho messo un avviso stampando il contenuto di getCookie('csrftoken')
prima della xhr.setRequestHeader
chiamata ed è effettivamente popolato con alcuni dati. Non sono sicuro di come verificare che il token sia corretto, ma sono incoraggiato a trovare e inviare qualcosa.
Ma Django sta ancora rifiutando il mio post AJAX.
Ecco il mio JavaScript:
$.post("/memorize/", data, function (result) {
if (result != "failure") {
get_random_card();
}
else {
alert("Failed to save card data.");
}
});
Ecco l'errore che vedo da Django:
[23 / feb / 2011 22:08:29] "POST / memorizza / HTTP / 1.1" 403 2332
Sono sicuro che mi manca qualcosa, e forse è semplice, ma non so cosa sia. Ho cercato SO e ho visto alcune informazioni su come disattivare il controllo CSRF per la mia vista tramite il csrf_exempt
decoratore, ma lo trovo poco interessante. L'ho provato e funziona, ma preferirei far funzionare il mio POST nel modo in cui Django è stato progettato per aspettarlo, se possibile.
Nel caso sia utile, ecco l'essenza di ciò che la mia vista sta facendo:
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))
Grazie per le tue risposte!