【问题标题】:POST request using ajax in Django在 Django 中使用 ajax 发布请求
【发布时间】:2015-08-26 03:56:43
【问题描述】:

当我尝试在 Django 中使用 ajax 发送 POST 请求时遇到了一些问题。我已经在这里研究了一些主题,但仍然找不到解决它们的方法。

这是我遵循this solution的javascript代码:

$.ajax({
    url: '{% url home %}',
    data: {selected_folders: formData,
           csrfmiddlewaretoken: '{{ csrf_token }}'},
    dataType: "json",
    type: "POST",
});

我也试试solution from Django

$("form").submit(function() {
    var csrftoken = $.cookie('csrftoken');
    $.ajax({
        url: '{% url home %}',
        data: {selected_folders: formData,
               csrfmiddlewaretoken: csrftoken},
        dataType: "json",
        type: "POST",
    });
});

这是我的view.py

def home(request):        
    if request.method == 'POST':
        Call_Other_Class()
    return render_to_response('home.html')

我的目标是将home.html的POST请求发送给自己,当home.html收到POST请求时,它会调用其他类做别的事情。我不确定将 CSRF 令牌放在模板中的哪个位置,以及我在 view.py 中的代码是否正确。

感谢您的阅读并解决我的问题。

编辑:

我将我的 javascript 代码编辑为:

<script type="text/javascript" charset="utf-8">
    $(document).ready(function() {
      var csrftoken = Cookies.get('csrftoken');
      function csrfSafeMethod(method) {
        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
      }
      $.ajax({
        url: '{% url home %}',
        data: {selected_folders: formData},
        beforeSend: function(xhr, settings) {
          if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
          }
        },
        dataType: "json",
        type: "POST",
      });
    });
</script>

HTML:

<form>
  <ul>
    <li id='key1'></li>
    <li id='key2'></li>
  </ul>
</form>

还是不行。

【问题讨论】:

  • csrf_token 应该是一个标头,而不是 POST 数据的一部分。试试this
  • 你的表单 HTML 是什么?
  • 您的 POST 得到了什么?顺便说一句,我不知道你的 HTML 是做什么的。

标签: javascript jquery python ajax django


【解决方案1】:

对于Js:

$("form").submit(function() {
   $.ajax({
       url: '{% url home %}',
       data: {selected_folders: formData,
           csrfmiddlewaretoken: $("[name = csrfmiddlewaretoken]"),
        dataType: "json",
        type: "POST",
    });
});

对于 view.py

def home(request):        
if request.method == 'POST' and request.is_ajax():
    Call_Other_Class()
return render_to_response('home.html')

【讨论】:

    【解决方案2】:

    最好的解决方案是使用在线文档。 据我回忆:

    • 首先在 Ajax 中调用 GET,然后在答案中强制 ensure_csrf_cookie decorator
    • 然后保留CSRF cookie,你有所有的详细解释here

    【讨论】:

      猜你喜欢
      • 2020-10-30
      • 2021-12-21
      • 2014-05-14
      • 2017-07-08
      • 2014-01-25
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多