【问题标题】:Django jQuery post requestDjango jQuery 发布请求
【发布时间】:2012-09-26 11:40:19
【问题描述】:
$.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() 函数。可能吗?我检查了其他问题并得到了这个解决方案。它应该工作。我做错了什么?

【问题讨论】:

    标签: javascript jquery django post request


    【解决方案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);
    });
    

    【讨论】:

      【解决方案2】:

      您需要在 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):
         ...
      

      【讨论】:

      • 为视图添加 @csrf_exempt 装饰器以快速修复效果很好,而且很有趣。
      • 感谢您的豁免。 Obv 99% 的时间都不希望在 prod 中这样做,但在 dev 中我不想花时间进行设置,而是想进行实际的原型设计。
      【解决方案3】:

      在 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/

      【讨论】:

        【解决方案4】:

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

        如果传入的 POST 请求未通过 Csrf 检查,Django 将返回 403 响应(禁止)。 可以通过jQuery的ajaxSetup来实现,代码sn-ps在here

        这对 GET 请求有效的原因只是 GET 请求没有被 csrf 中间件检查。

        您似乎在这里构建了一个表单,另一件要考虑的事情是使用基于类的表单。他们为您处理 get/post 以及参数验证。非常整洁。尤其是当您制作表单来编辑/创建/删除模型实例时,您可以使用ModelForms 和 CreateViews 的强大功能。非常整洁。

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

        【讨论】:

        • 是的,在其他网站上我正在使用 FormView。但在这种情况下,我不能(长话短说)。 :) 现在一切正常,但在终端我看到 [05/Oct/2012 15:08:11] "POST /something/ HTTP/1.1" 500 9499
        • 500 只是服务器错误。这可能是由于您的 post 方法中的任何 python 错误造成的。
        • 确实如此。但不是以你能看到的方式。 stacktrace 和其他 django 调试信息在您的 ajax 请求中作为 HttpResponse 返回。您可以通过在 jquery.ajax 错误回调中记录对它的响应来记录它。使用 firebug/chrome 开发人员工具查看究竟发生了什么可能会更容易。这些工具将为您提供传递给服务的确切参数和服务器的响应,这将是 Django 调试信息。
        • 我也设法解决了这个错误。我只需要在 post() 函数的末尾添加“return self.render_to_response({})”。
        猜你喜欢
        • 2015-03-10
        • 1970-01-01
        • 2020-10-30
        • 2014-09-17
        • 1970-01-01
        • 2014-06-01
        • 2018-10-19
        • 2014-05-14
        • 2020-09-15
        相关资源
        最近更新 更多