XMLHttpRequest的Access-Control-Allow-Origin错误

时间:2013-02-28 02:06:30

标签: django xmlhttprequest

我正在开发一个Django服务器。我需要从外部服务here获取一些数据。

以下是我正在使用的JavaScript代码:

 function getDeclination(latitude, longitude) {

        var url = 'http://www.ngdc.noaa.gov/geomag-web/calculators/calculateDeclination';

        url += '?';
        url += 'lat1=' + latitude;
        url += '&'
        url += 'lon1=' + longitude;
        url += '&';
        url += 'resultFormat=xml';

        var xmlHttp = null;
        xmlHttp = new XMLHttpRequest();
        xmlHttp.open( "GET", url, false );

        xmlHttp.send();
        xml = xmlHttp.responseXML;

        var temp_d = xml.getElementsByTagName('declination');

        var string = temp_d[0].childNodes[0].nodeValue;

        string = string.substring(1, string.length - 2);

        return parseFloat(string);
    }

使用此代码进行此类 getDeclination(46.0815605783,13.2158580422)之类的调用会出现此错误:

 XMLHttpRequest cannot load 
 http://www.ngdc.noaa.gov/geomag-web/calculators/calculateDeclination?lat1=46.0815605783&lon1=13.2158580422&resultFormat=xml. 
 Origin http://127.0.0.1:8000 is not allowed by Access-Control-Allow-Origin

如何解决此问题并返回测试?

修改

所以我安装了中间件和JS,但我无法得到结果。 也许我在安装中间件时遇到了一些错误,这对我来说是第一次。 我知道Django找到了它,并且它正在使用它,但我不知道我是否正确完成了设置。

 XS_SHARING_ALLOWED_ORIGINS = "http://127.0.0.1:8000"
 XS_SHARING_ALLOWED_METHODS = ['POST','GET','OPTIONS', 'PUT', 'DELETE']  

我已将此代码放在 settings.py 中,这是正确的吗?因为我仍然得到同样的错误。

2 个答案:

答案 0 :(得分:1)

在开发过程中使用this middleware,并在将所有内容投入生产时将其禁用。

修改

至于Javascript方面的事情,我刚刚测试了它,它运行正常。它确实需要安装jQuery和中间件。

function getDeclination(latitude, longitude){
    var url = "http://www.ngdc.noaa.gov/geomag-web/calculators/calculateDeclination";

    url += "?";
    url += "lat1=" + latitude;
    url += "&"
    url += "lon1=" + longitude;
    url += "&";
    url += "resultFormat=xml";

    $.ajax({
        url: url,
        success: function(data){
            var declination = parseFloat($(data).find("declination").text());
            alert(declination);
        }
    });
}

答案 1 :(得分:0)

最后,我实现了代码,以便从服务器调用中获得偏差。

为了完整起见,这里是代码:

 import urllib2 
 from xml.dom.minidom import parseString

 # build the url
 def buildUrl(latitude, longitude):
    return settings.MAGNETIC_URL + '?' + 'lat1=' + str(latitude) + '&' + 'lon1=' + str(longitude) + '&' + 'resultFormat=xml'


 # load the page from the address       
 def retrieveWeb(address):

    try:                 
            web_handle = urllib2.urlopen(address)

    except urllib2.HTTPError, e: 
            error_desc = BaseHTTPServer.BaseHTTPRequestHandler.responses[e.code][0] 
            print "Cannot retrieve URL: HTTP Error Code", e.code, "Error: ", error_desc 
            sys.exit(1)         
    except urllib2.URLError, e: 
            print "Cannot retrieve URL: " + e.reason[1] 
            sys.exit(1)         
    except:                 
            print "Cannot retrieve URL: unknown error"                 
            sys.exit(1) 

    return web_handle  


 # main function to get declination
 def retrieveDeclination(lat, lng):

    # build url
    address = buildUrl(lat, lng) 

    # get the page
    page = retrieveWeb(address)

    # get xml
    xml = page.read()  

    page.close()

    # inizio il parsin
    dom = parseString(xml)

    #retrieve the first xml tag (<tag>data</tag>) that the parser finds with name tagName:
    xmlTag = dom.getElementsByTagName('declination')[0].toxml()

    #strip off the tag (<tag>data</tag>  --->   data):
    xmlData=xmlTag.replace('<declination>','').replace('</declination>','')

    # parse the output as float
    return float(xmlData)