我正在尝试在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代码:
<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>
URLS
(r'^accounts/(?P<username>[\@\.\w-]+)/listview/$', profile_listview),
值得注意的事情:
我在设置中打开了csrf中间件
在jQuery AJAX代码中,url和数据都发送了正确的信息
当我点击删除按钮时,我收到403禁止错误。
打印“请求是ajax”不会在控制台(或任何地方)打印。
我也很困惑,因为我收到了相互矛盾的信息。有人告诉我应该通过javascript(https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/)添加csrf值。这给我留下了2个问题。 1.这与在我的POST请求中添加csrfmiddlewaretoken:'{{csrf_token}}'有什么不同? 2.更重要的是,当使用@csrf_exempt时,我仍然得到403错误,这使得这个问题没有实际意义吗?
答案 0 :(得分:1)
@csrf_exempt需要在urls.py调用的函数之前。在OP的示例中,从未调用delete_object,因为在调用没有装饰器的profile_listview时错误已经发生。
在旁注中,如果URL不存在,则可能会出现类似情况(使用@csrf_exempt但获得403)。出于某种原因(安全性?),它将返回403而不是404,因此很难调试。
答案 1 :(得分:0)
因为catavaran认为你打错了视图。你应该调用delete_object视图。例如,添加网址
(r'^accounts/(?P<username>[\@\.\w-]+)/listview/delete_object$', delete_object)
和AJAX
$.ajax({
type: "POST",
url: "/accounts/" + my_app.username + "/listview/delete_object",
data: { entryname:id },
});
我希望有帮助
答案 2 :(得分:0)
据我了解,delete_object是profile_listview中的一个函数,但是profile_listview并没有调用它。因此,profile_listview没有http响应。 发布错误消息