2015-06-26 92 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