在简单Python网络服务器的do_GET()方法中使用HTML
我最近刚接触Python,做了很多不同的事情,感觉挺不错的。不过,我在下面这段代码上遇到了一些麻烦。
import http.server
import socketserver
import glob
import random
class Server(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
self.send_response(200, 'OK')
self.send_header('Content-type', 'html')
self.end_headers()
self.wfile.write(bytes("<html> <head><title> Hello World </title> </head> <body>", 'UTF-8'))
images = glob.glob('*.jpg')
rand = random.randint(0,len(images)-1)
imagestring = "<img src = \"" + images[rand] + "\" height = 1028 width = 786 align = \"right\"/> </body> </html>"
self.wfile.write(bytes(imagestring, 'UTF-8'))
def serve_forever(port):
socketserver.TCPServer(('', port), Server).serve_forever()
if __name__ == "__main__":
Server.serve_forever(8000)
我想做的事情是从一个文件夹里的多张图片中随机选一张,然后把它放到网页请求的响应里。代码本身运行得很好,但当我通过浏览器访问服务器时,图片却没有显示出来。网页的HTML结构是正确的。文件的权限设置为755。此外,我还尝试在do_GET方法里创建一个index.html文件,但也没有成功。虽然index.html生成得没问题,但这次在浏览器里的响应什么都没显示(连标题里的“hello world”都没出现)。
我是不是漏掉了什么简单的东西?我在想,是不是应该重载SocketServer.BaseServer的handle_request方法,因为文档里说不应该覆盖BaseHTTPServer的handle()方法,而是应该重载相应的do_*方法?
3 个回答
0
我有一些和你修改后的代码很相似的代码(就是作为答案发布的那个版本),对我来说是可以正常工作的。唯一的不同是我没有发送内容的长度,所以这可能就是你遇到问题的原因。
0
我怀疑当浏览器向你的服务器请求你在HTML中放的图片时,你却给它发送了另一个页面的HTML。你可能需要在你的do_GET函数开头加一个检查,确保这不是一个请求图片的请求(或者是请求某个特定页面的请求)。
1
哦,你在那一行里混用了很多 "
和 \"
:
"<img src = \" + images[rand] + '\" height = 1028 width = 786 align = \"right\"/> </body> </html>'
其实应该是这样的:
'<img src = "' + images[rand] + '" height = 1028 width = 786 align="right"/> </body> </html>'
否则你得到的不是图片,而是文本 "images[rand]"
!