【问题标题】:XMLHttpRequest error when using ajax in Django在 Django 中使用 ajax 时出现 XMLHttpRequest 错误
【发布时间】:2016-03-18 14:34:39
【问题描述】:

我目前正在处理一个在 Django 视图中有一个表单的网页。此表单在其输入字段中采用艺术家、城市和州的名称。这些输入值最终将连接到一个链接到音乐会数据的 JSON 文件的 url(当我到达那部分时),但目前,我只是用硬编码值对其进行测试。应该在单击提交按钮时对这个 url 进行 ajax 调用(我还没有实现),但是现在,我只是在测试 ajax 调用本身是否可以工作。这是表单(我使用的是脆的表单,所以我没有手动添加输入字段):

<form method= 'POST' action = ''>{% csrf_token %}
{{ form|crispy }}

<input type= 'submit' value= 'Submit'>

和 ajax 调用:

$.ajax({
    dataType:'json',
    url: 'http://api.bandsintown.com/events/search?artists[]=foals&location=New York,NY&radius=150&format=json&app_id=YOUR_APP_ID',
    success: function(data){
        //console.log(data);
        concertData = data;
        runMainProgram();
        $(data.tickets).each(function(index, value){
                console.log(value.p);
        });
    }
})

这是来自 forms.py 的页面表单:

class SearchForm(forms.Form):
    artist_select = forms.CharField()
    city = forms.CharField()
    state = forms.CharField()

我认为自从我添加了{% csrf_token %} 之后,跨源引用不会出错,但是当我加载页面时,我收到了错误:

XMLHttpRequest cannot load http://api.bandsintown.com/events/search?artists[]=foals&amp;location=New%20York,NY&amp;radius=150&amp;format=json&amp;app_id=YOUR_APP_ID. No 'Access-Control-Allow-Origin' header is present on the requested resource.

我可能误解了这个错误,但这似乎是问题所在。我应该如何解决这个问题?

【问题讨论】:

    标签: jquery python json ajax django


    【解决方案1】:

    您遇到错误是因为您没有在请求标头中发送 csrf_token:

    function getCookie(name) {
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
          var cookies = document.cookie.split(';');
          for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            if (cookie.substring(0, name.length + 1) == (name + '=')) {
              cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
              break;
            }
          }
        }
        return cookieValue;
    }  
    
    var csrftoken = getCookie('csrftoken');
    
    $.ajax({
        headers: {'X-CSRFToken': csrftoken}, // you add you token here
        dataType:'json',
        url: 'http://api.bandsintown.com/events/search?artists[]=foals&location=New York,NY&radius=150&format=json&app_id=YOUR_APP_ID',
        success: function(data){
            //console.log(data);
            concertData = data;
            runMainProgram();
            $(data.tickets).each(function(index, value){
                    console.log(value.p);
            });
        }
    })
    

    Django检查Ajax

    【讨论】:

    • 感谢您的回答!但由于某种原因,我收到错误消息:ReferenceError: jquery is not defined var cookie = jquery.trim(cookies[i]); 是从 CDN 加载后应该自动定义的 jquery 对象吗?另外,您从哪里获得从 cookie 罐中获取 csrftoken 的代码?我的意思是,你怎么知道要这么做?
    • JavaScript 是区分大小写的,所以它不会知道jquery 你应该写成jQuery 就像在例子中一样,或者干脆写成$。您的错误消息中提到缺少标头。检查帖子的来源。
    • 好的,看来所有语法错误都已修复,但我现在收到警告:Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://api.bandsintown.com/events/search?artists[]=foals&amp;location=New%20York,NY&amp;radius=150&amp;format=json&amp;app_id=YOUR_APP_ID. (Reason: CORS header 'Access-Control-Allow-Origin' missing). 我认为我做的一切都是正确的,但问题可能与事实上我正在使用 Django crispy forms
    • 我不认为它有任何脆的形式,似乎问题出在 CROS 标头上,查看我在这里分享的解决方案 stackoverflow.com/5658350,应该可以解决。
    • 检查这个stackoverflow.com/a/9627028/5658350,因为你需要与服务器通信的只是crsf和cors头,否则它可能是某个地方的冲突/错误配置。
    猜你喜欢
    • 2022-01-16
    • 2013-03-14
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多