2015-08-27 60 views
1

我是新來的python,我試圖通過jquery ajax調用使用http請求從python腳本獲取數據。但是,由於python腳本不允許跨域請求,我得到了下面的錯誤。Python - 訪問控制允許起源

跨源請求被阻止:同源策略不允許讀取遠程資源http://somehost.com:8000/gen.py。 (原因:缺少CORS頭'Access-Control-Allow-Origin')。

我不確定我需要在下面的腳本中更改服務器跨域請求。清楚的是,我使用的是安裝在紅帽企業Linux服務器版本6.5(聖地亞哥)上的python v2.6.6。下面是我到目前爲止嘗試過的python服務器代碼。

#!/usr/bin/env python 

import BaseHTTPServer 
import CGIHTTPServer 
import cgitb; cgitb.enable() ## This line enables CGI error reporting 

server = BaseHTTPServer.HTTPServer 
handler = CGIHTTPServer.CGIHTTPRequestHandler 
server_address = ("", 8000) 
handler.cgi_directories = ["/"] 

httpd = server(server_address, handler) 
httpd.serve_forever() 

這裏是從位於不同服務器上的HTML文件中的jQuery代碼:

$(document).ready(function(){ 
    $("button").click(function(){ 
     $.ajax({   
      url: "http://somehost.com:8000/gen.py", 
      type: 'GET',   
      success: function(data) {    
      console.log(data); 
      }, 
      error: function(e) {   
      console.log(e.message); 
      } 
     }); 
    }); 
}); 

任何指針,這是明顯的。讓我知道我是否應該提供更多細節。

預先感謝您。

+0

什麼是您的基礎設施? javascript如何提供服務?你的web應用程序沒有使用python嗎? – e4c5

+0

@ e4c5 python腳本位於linux上 –

+0

這不是我所要求的。我在問你的javascript是否在一個web服務器上,而你的python腳本是在另一個 – e4c5

回答

0

正如e4c5所提到的,您需要提出一個CORS請求。由於jquery不是由提供gen.py的同一服務器提供的,因此您需要在python服務器端使用一個標頭以允許瀏覽器檢索資源。這same-origin policy是爲了防止跨站點腳本。

要使用BaseHTTPServer執行此操作,您需要重新定義請求處理程序並提供對self.send_header("Access-Control-Allow-Origin", "*")的調用。這個answer顯示瞭如何使用BaseHTTPServer完成它,但它相當長並涉及。

這個answer有一個非常簡單的實現,如何在SimpleHTTPServer上設置CORS頭,它具有與BaseHTTPServer相似的結構,您可以輕鬆移植到該結構上。

*關於send_header呼叫中的*,這允許來自任何來源的請求獲得gen.py。取決於這是什麼,這可能並不重要,但是如果確實如此,您可能需要制定更嚴格的政策。