8
$.ajax({
    url:'/',
    type: "POST",
    data: {name: 'name', age: 'age'},
    success:function(response){},
    complete:function(){},
    error:function (xhr, textStatus, thrownError){}
});

在views.py中:

class SomeView(generic_views.TemplateView):
    template_name = 'something.html'

    def get(self, request, *args, **kwargs):
        ...something...
        return self.render_to_response(context)

    def post(self, request, *args, **kwargs):
        name = request.POST['name']
        age = request.POST['age']
        ...something...

我得到:[05/Oct/2012 12:03:58] "POST /something/ HTTP/1.1" 403 2294

我想通过 jQuery 将这些数据(姓名和年龄)发送到“SomeView”中的这个 post 函数。这和加载的模板是同一个视图,只是请求类型不同。在 get() 上加载模板,在 post 上,应该调用 post() 函数。可能吗?我检查了其他问题并得到了这个解决方案。它应该工作。我究竟做错了什么?

4

4 回答 4

12

您的问题的答案是您做错了什么:不多!

如果传入的 POST 请求未通过 Csrf 检查,Django 将返回 403 响应(禁止)。您可以通过 jQuery 的 ajaxSetup 执行此操作,代码片段可在此处找到

这确实适用于 GET 请求的原因只是 GET 请求没有被 csrf 中间件检查。

看起来您正在这里构建一个表单,另一件要考虑的事情是使用基于类的表单。他们为您处理 get/post 以及参数验证。井井有条。特别是当您制作表单来编辑/创建/删除模型实例时,您可以使用ModelForms和 CreateViews 的强大功能。井井有条。

掌握这些基于通用类的视图可能需要一些时间。但这非常值得。

于 2012-10-05T10:24:27.763 回答
9

您需要在 ajax 调用中包含一个CSRF(跨站点请求伪造)令牌。这在这里有很好的记录:https ://docs.djangoproject.com/en/dev/ref/contrib/csrf/

或者,如果您想使用快速修复,请@csrf_exempt为您的视图使用装饰器:

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_view(request):
   ...
于 2012-10-05T10:22:40.043 回答
4

在 Django 模板中,您可以添加此...

{% csrf_token %}

它将向您的页面 html 输出类似的内容...

<input type="hidden" name="csrfmiddlewaretoken" value="ckhUdNOTj88A...hfTnREALlks2kz">

然后使用 Javascript,您可以简单地找到这个输入并获取它的值 - 类似于这个非 jQuery 示例......

var el = document.getElementsByName("csrfmiddlewaretoken");
csrf_value = el[0].getAttribute("value");

最后将 csrf_value 添加到您的 jQuery AJAX 表单数据行,如下所示...

data: {name: 'name', age: 'age', csrfmiddlewaretoken: csrf_value},

这是一个有效的 jsFiddle 概念:https ://jsfiddle.net/vdx1Lfpc/18/

于 2017-06-24T04:45:08.323 回答
1

我在另一篇文章中读到,您可以执行以下操作:

$.ajax({
    method: "POST",
    url: "{% url 'some_route' %}",
    headers: {'X-CSRFToken': '{{ csrf_token }}'},
    contentType: "application/json",
    dataType: 'json',
    data: {name:$('#id_name').val()}
})
.fail(function(message) {
    alert('error');
})
.done(function(data) {
    alert(data);
});
于 2020-01-16T13:53:17.077 回答