在AJAX请求中使用@csrf_exempt时,为什么会出现403 Forbidden错误?

我试图在Django中编写一个非常基本的AJAX请求,并且我一直在Chrome Dev和Django控制台中获得403禁用错误。 我前几天发布了一个类似的问题并尝试了所有提议的解决方案,包括@csrf_exempt(以排除这是否是一个csrf问题),我尝试在AJAX POST请求中包含csrfmiddlewaretoken:'{{csrf_token}}’ (在数据下面),这也没有解决问题。 这是我的代码。

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/') 

和模板中的AJAX代码:

  var my_app = { username: "{{ request.user.username }}" };   $(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; }); });  

URLS

 (r'^accounts/(?P[\@\.\w-]+)/listview/$', profile_listview), 

值得注意的事情:

  1. 我在我的设置中打开了csrf中间件

  2. 在jQuery AJAX代码中,url和data都发送了正确的信息

  3. 当我单击删除按钮时,我收到403禁止错误。

  4. 打印“请求是ajax”不会在控制台(或任何地方)中打印。

我也很困惑,因为我收到了相互矛盾的信息。 有人告诉我应该通过javascript( https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/ )添加csrf值。 这给我留下了2个问题。 1.这与在我的POST请求中添加csrfmiddlewaretoken:'{{csrf_token}}’有什么不同? 2.更重要的是,当使用@csrf_exempt时,我仍然得到403错误,这使得这个问题没有实际意义吗?

据我所知,delete_object是profile_listview中的一个函数,但是profile_listview没有调用它。 因此,profile_listview没有http响应。 发布错误消息

@csrf_exempt需要在urls.py调用的函数之前。 在OP的示例中,从未调用delete_object,因为在调用没有装饰器的profile_listview时错误已经发生。

在旁注中,如果URL不存在,则可以具有类似的情况(使用@csrf_exempt但获得403)。 出于某种原因(安全性?),它将返回403而不是404,因此很难调试。

因为catavaran认为你叫错视图。 你应该调用delete_object视图。 例如,添加URL

 (r'^accounts/(?P[\@\.\w-]+)/listview/delete_object$', delete_object) 

和AJAX

 $.ajax({ type: "POST", url: "/accounts/" + my_app.username + "/listview/delete_object", data: { entryname:id }, }); 

我希望有所帮助