【发布时间】:2015-03-15 10:13:58
【问题描述】:
我正在尝试在 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>
网址
(r'^accounts/(?P<username>[\@\.\w-]+)/listview/$', profile_listview),
注意事项:
我在设置中打开了 csrf 中间件
在 jQuery AJAX 代码中,url 和 data 都在发送正确的信息
当我单击删除按钮时,我收到 403 禁止错误。
打印“request is ajax”不会在控制台(或任何地方)打印。
我也很困惑,因为我得到了相互矛盾的信息。有人告诉我应该通过 javascript (https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/) 添加 csrf 值。这给我留下了2个问题。 1. 这与在我的 POST 请求中添加 csrfmiddlewaretoken: '{{ csrf_token }}' 有何不同?和 2. 更重要的是,我在使用 @csrf_exempt 时仍然收到 403 错误这一事实是否让这成为一个有争议的问题?
【问题讨论】:
-
但是您没有在请求中发送 csrf 令牌。
-
添加 csrf_exempt 装饰器应该会消除该限制,但奇怪的是会返回 403。
-
另一方面,您的 JavaScript 代码将无法处理服务器端
HttpResponseRedirect。您需要将其作为字符串传回,然后执行:top.location = json.redirect_url例如。 -
你确定你调用的是正确的视图吗?请告诉我们你
urls.py。 -
我使用我的 URLS 以及包含处理 AJAX 请求的方法的方法 'profile_listview' 更新帖子。