2013-02-28 40 views
1

我正在開發一個Django服務器。我需要從外部服務here獲得一些數據。使用XMLHttpRequest訪問控制允許來源錯誤

下面是我使用的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,這是正確的?因爲我仍然得到相同的錯誤。

回答

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); 
     } 
    }); 
} 
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) 
相關問題