
Python 中继承 SimpleHTTPRequestHandler 自定义 HTTP 服务器时,若未调用 self.end_headers(),响应头将不会被实际发送,导致浏览器无法识别 Content-Type,从而以纯文本方式显示 HTML 内容。
python 中继承 `simplehttprequesthandler` 自定义 http 服务器时,若未调用 `self.end_headers()`,响应头将不会被实际发送,导致浏览器无法识别 `content-type`,从而以纯文本方式显示 html 内容。
在使用 http.server 模块构建自定义 HTTP 处理器时,一个常见但容易被忽略的关键点是:仅调用 send_header() 并不会真正将响应头写入网络流——必须显式调用 self.end_headers() 才能结束头部写入、分隔响应头与响应体,并触发底层缓冲区刷新。
回顾原始代码的问题所在:
self.send_response(200)
self.send_header('Content-Type', 'text/html; charset=UTF-8')
self.send_header('Content-Length', len(html_content)) # ❌ 错误:len() 返回 int,但 send_header 要求 str
self.wfile.write(html_content.encode('utf-8')) # ❌ 错误:在 end_headers() 前写入 body
这里存在两个关键错误:
-
send_header('Content-Length', ...)的值必须是字符串(如'234'),传入整数会引发TypeError; -
最核心问题:缺少
self.end_headers()调用 —— 导致所有已设置的响应头(包括Content-Type)从未被写出,浏览器因此收不到任何响应头,只能依据默认行为(如text/plain)解析响应体,造成 HTML 源码被直接显示而非渲染。
✅ 正确做法如下:
self.end_headers()
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











