Sto provando a scrivere una richiesta AJAX molto semplice in Django, e continuo a ricevere l'errore 403 vietato sia nelle console Chrome Dev che in quelle Django. Ho postato una domanda simile l'altro giorno e ho provato tutte le soluzioni proposte incluso @csrf_exempt (per escludere se si tratta anche di un problema csrf), ho provato a includere csrfmiddlewaretoken: '{{csrf_token}}' nella richiesta POST AJAX (sotto i dati), anche questo non risolve il problema. Ecco il mio codice.Perché ricevo un errore Proibito 403 quando si utilizza @csrf_exempt nella richiesta AJAX?
def profile_listview(request, username,
template_name=userena_settings.USERENA_PROFILE_DETAIL_TEMPLATE,
extra_context=None, **kwargs):
user = get_object_or_404(get_user_model(),
username__iexact=username)
fullsalelist = Entry.objects.filter(author__username__iexact=username)
@csrf_exempt
def delete_object(request):
if request.is_ajax():
print "request is ajax"
object_name = request.POST.get('entryname')
targetobject = Entry.objects.get(headline=object_name)
if request.user.username == targetobject.author:
targetobject.delete()
print "hello"
return HttpResponseRedirect('/storefront/')
E il codice AJAX nel modello:
<script type="text/javascript">
var my_app = {
username: "{{ request.user.username }}"
};
</script>
<script>
$(document).ready(function() {
$(".delete_button").click(function() {
var id = $(this).attr('id');
$.ajax({
type: "POST",
url: "/accounts/" + my_app.username + "/listview/",
data: { entryname:id },
});
return false;
});
});
</script>
URL
(r'^accounts/(?P<username>[\@\.\w-]+)/listview/$', profile_listview),
cose degne di nota: il middleware
ho CSRF attivata nelle mie impostazioni
all'interno del codice jQuery AJAX, URL e i dati sono entrambi inviare le informazioni corrette
quando clicco sul pulsante Elimina, ottengo l'errore proibito 403.
La stampa "richiesta è ajax" non viene stampata nella console (o in qualsiasi luogo).
Sono anche confuso perché sto ottenendo informazioni contrastanti. Mi è stato detto che dovrei aggiungere il valore csrf tramite javascript (https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/). Questo mi lascia con 2 domande. 1. Qual è la differenza rispetto all'aggiunta di csrfmiddlewaretoken: '{{csrf_token}}' nella mia richiesta POST? e 2. Ancora più importante, il fatto che ottenga ancora un errore 403 quando utilizzo il tipo @csrf_exempt rende questo un punto controverso?
Ma non si invia il token csrf nella richiesta. –
L'aggiunta del decoratore csrf_exempt dovrebbe rimuovere tale restrizione, ma è strano che venga restituito un 403. – Brandon
Su una nota diversa, il codice JavaScript non sarà in grado di elaborare "HttpResponseRedirect" lato server.Dovresti passarlo come una stringa e poi fare: 'top.location = json.redirect_url' per esempio. – Brandon