继承http.server.SimpleHTTPRequestHandler后浏览器未接收响应头问题
问题原因与解决方法
核心原因
你遇到的问题根源是缺少self.end_headers()调用:
send_response()和send_header()只是将响应头数据写入内部缓冲区,并没有实际发送给客户端。必须调用end_headers()来完成响应头的发送(包括添加HTTP协议要求的头与体之间的空行),否则浏览器永远收不到响应头信息,只能将返回内容当作纯文本处理。- 额外小问题:原代码中
Content-Length用len(html_content)计算的是字符串字符数,而实际传输的是UTF-8编码后的字节流,数值会不准确(比如包含中文时偏差明显)。
修复后的代码
import http.server import socketserver class CustomHandler(http.server.SimpleHTTPRequestHandler): def do_GET(self): html_content = "<html><body><h1>Hello, World!</h1></body></html>" encoded_content = html_content.encode('utf-8') self.send_response(200) self.send_header('Content-Type', 'text/html; charset=UTF-8') self.send_header('Content-Length', str(len(encoded_content))) self.end_headers() # 关键步骤:发送响应头并结束头部分 self.wfile.write(encoded_content) def main(port_no): with socketserver.TCPServer(("", port_no), CustomHandler) as httpd: print("Serving at port ", port_no) httpd.serve_forever() if __name__ == '__main__': main(8098)
关键修改点
- 先对HTML内容做UTF-8编码,得到实际传输的字节流
encoded_content - 添加
self.end_headers()调用,确保响应头被完整发送给浏览器 - 用
len(encoded_content)正确计算响应体的字节长度,作为Content-Length的取值
内容的提问来源于stack exchange,提问作者Limina102
相关产品推荐
相关产品推荐

