Mógłbym skorzystać z pomocy w przestrzeganiu mechanizmu ochrony CSRF Django za pośrednictwem mojego postu AJAX. Postępowałem zgodnie ze wskazówkami tutaj:
http://docs.djangoproject.com/en/dev/ref/contrib/csrf/
Skopiowałem dokładnie przykładowy kod AJAX, który mają na tej stronie:
http://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax
Umieszczam alert drukujący zawartość getCookie('csrftoken')
przed xhr.setRequestHeader
połączeniem i rzeczywiście jest on wypełniony niektórymi danymi. Nie jestem pewien, jak sprawdzić, czy token jest poprawny, ale zachęcam mnie do znalezienia i wysłania czegoś.
Ale Django nadal odrzuca mój post AJAX.
Oto mój JavaScript:
$.post("/memorize/", data, function (result) {
if (result != "failure") {
get_random_card();
}
else {
alert("Failed to save card data.");
}
});
Oto błąd, który widzę w Django:
[23 / lut / 2011 22:08:29] „POST / memorize / HTTP / 1.1” 403 2332
Jestem pewien, że coś mi umknęło, a może to proste, ale nie wiem, co to jest. Szukałem w SO i widziałem informacje o wyłączaniu sprawdzania CSRF dla mojego widoku za pomocą csrf_exempt
dekoratora, ale uważam to za nieatrakcyjne. Wypróbowałem to i działa, ale wolę, aby mój test POST działał w sposób, w jaki zaprojektowano Django, jeśli to możliwe.
Na wszelki wypadek pomocne jest to, co robi mój pogląd:
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))
Dziękuję za odpowiedzi!