在简单Python网络服务器的do_GET()方法中使用HTML

2 投票
3 回答
27645 浏览
提问于 2025-04-16 20:34

我最近刚接触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]"

撰写回答