You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

继承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)

关键修改点

  1. 先对HTML内容做UTF-8编码,得到实际传输的字节流encoded_content
  2. 添加self.end_headers()调用,确保响应头被完整发送给浏览器
  3. 用len(encoded_content)正确计算响应体的字节长度,作为Content-Length的取值

内容的提问来源于stack exchange,提问作者Limina102

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 11:38:21