2015-06-26 127 views
0

我寫一個簡單的python服務器,並使用do_GET輸入反應在HTML以下無法讀取蟒蛇服務器

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler 

class RequestHandler(BaseHTTPRequestHandler): 
    def _writeheaders(self): 
     self.send_response(200) 
     self.send_header('Content-type', 'text/html') 
     self.end_headers() 

    def do_HEAD(self): 
     self._writeheaders() 

    def do_GET(self): 
     f = open("/full/path/to.html") 
     self._writeheaders() 
     self.wfile.write(f.read()) 


serveraddr = ('localhost', 7070) 
srvr = HTTPServer(serveraddr, RequestHandler) 
srvr.serve_forever() 

返回一個HTML一個具有

<html> 
<head> 
    <title>myChart</title> 
    <meta charset="UTF-8"> 
</head> 

<div > 
    ...divs... 
</div> 


<script> 

...js functions... 

</script> 

<body> 

<script src="js/jquery-1.8.2.min.js" type="text/javascript"></script> 


</body> 
</html> 

我能得到該HTML,但在瀏覽器控制檯說Uncaught SyntaxError: Unexpected token <jquery-1.8.2.min.js:1

如果我直接在瀏覽器中打開html頁面,一切都很好,所以問題不在htm升

---- ----更新

我使用Chrome,並且通過單擊控制檯中的錯誤,源露面是在HTML本身,而不是JS文件。我試圖指定的HTML的js文件的完整路徑,但它仍然顯示我在錯誤的HTML文件

有JS文件工作正常,當我打開HTML文件通過在瀏覽器目錄輸入

此外,在控制檯的python我可以看到:

127.0.0.1 - - [28/Jun/2015 00:12:28] "GET/HTTP/1.1" 200 - 
127.0.0.1 - - [28/Jun/2015 00:12:28] "GET /full/path/to/js/jquery-1.8.2.min.js HTTP/1.1" 200 - 
127.0.0.1 - - [28/Jun/2015 00:12:28] "GET /favicon.ico HTTP/1.1" 200 - 
+0

它似乎在文件「jquery-1.8.2.min.js」在第1行有一個「<」這是無效的......你是以編程方式壓縮該文件還是原來的?!你能提供完整的HTML和腳本嗎? – daveoncode

+0

@daveoncode請參閱我的更新 – pledez

回答

0

RequestHandler將成爲你的HTML頁面不管網址是否該URL是//index.html/favicon.ico,或者(在你的情況下)/js/jquery-1.8.2.min.js。如果你想/js/jquery-1.8.2.min.js再次成爲了實際的JavaScript文件,而不是你的HTML頁面,你需要處理的是特別,例如:

def do_GET(self): 
    if self.path == '/js/jquery-1.8.2.min.js': 
     filename = 'js/jquery-1.8.2.min.js' 
    else: 
     filename = 'index.html' 
    with open(filename, 'r') as f: 
     self._writeheaders() 
     self.wfile.write(f.read()) 

你可能會想改變這種有點使得請求JavaScript文件給出了一個合適的Content-Type: text/javascript頭,而不是Content-Type: text/html,並HEAD回報標頭與GET一致等

另外,如果你開始啓動服務大文件,你可能要考慮使用shutil.copyfileobj中複製數據該文件到self.wfile,而不是閱讀wh ole文件寫入內存並全寫出來。

+0

感謝您的回答。有沒有更好的方法將URL請求映射到'do_GET',比如在Java中我們使用'@RequestMapping('/ xxx)'? – pledez

+0

@pledez:不與'BaseHTTPServer'模塊一起,不。也就是說,我不確定你的項目是如何參與的,但如果它比這更復雜,那麼可能需要研究一些提供這種功能的庫 - [Flask](http://flask.pocoo.org /),例如,似乎是一個相當流行的Python Web框架。 – icktoofay