Tôi có thể sử dụng một số trợ giúp tuân thủ cơ chế bảo vệ CSRF của Django thông qua bài đăng AJAX của tôi. Tôi đã làm theo chỉ dẫn ở đây:
http://docs.djangoproject.com/en/dev/ref/contrib/csrf/
Tôi đã sao chép chính xác mã mẫu AJAX trên trang đó:
http://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax
Tôi đặt một cảnh báo in nội dung getCookie('csrftoken')
trướcxhr.setRequestHeader
cuộc gọi và nó thực sự được điền với một số dữ liệu. Tôi không chắc chắn làm thế nào để xác minh rằng mã thông báo là chính xác, nhưng tôi khuyến khích rằng nó tìm và gửi một cái gì đó.
Nhưng Django vẫn từ chối bài AJAX của tôi.
Đây là JavaScript của tôi:
$.post("/memorize/", data, function (result) {
if (result != "failure") {
get_random_card();
}
else {
alert("Failed to save card data.");
}
});
Đây là lỗi tôi thấy từ Django:
[23/2/2011 22:08:29] "POST / ghi nhớ / HTTP / 1.1" 403 2332
Tôi chắc chắn rằng tôi đang thiếu một cái gì đó, và có lẽ nó đơn giản, nhưng tôi không biết nó là gì. Tôi đã tìm kiếm xung quanh SO và thấy một số thông tin về việc tắt kiểm tra CSRF cho chế độ xem của tôi thông quacsrf_exempt
trang trí, nhưng tôi thấy điều đó không hấp dẫn. Tôi đã thử nó và nó hoạt động, nhưng tôi muốn POST của tôi hoạt động theo cách Django được thiết kế để mong đợi nó, nếu có thể.
Chỉ trong trường hợp nó hữu ích, đây là ý chính của những gì quan điểm của tôi đang làm:
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))
Cảm ơn bạn đã trả lời!