Python 3.11:SimpleHTTPRequestHandler无法设置extensions_map及YAML内容类型异常
解决Python 3.11中SimpleHTTPRequestHandler无法设置YAML内容类型的问题
问题场景
尝试用Python Web服务器作为Helm Chart仓库,需要将YAML文件的Content-Type设置为text/yaml或text/x-yaml,但在Python 3.11环境下,直接修改SimpleHTTPRequestHandler的extensions_map不生效,点击网站中的YAML文件时,服务器不会展示文件内容,而是弹出下载选项。
问题原因
Python 3.11中,SimpleHTTPRequestHandler的extensions_map类属性从mimetypes模块动态加载,直接覆盖类属性或实例属性的方式不会被请求处理逻辑采用,导致自定义的内容类型映射无效。
修复方案
通过重写guess_type方法,自定义YAML文件的内容类型映射,确保服务器返回正确的Content-Type头部。
修复后的代码
import http.server import socketserver PORT = 8000 DIRECTORY = "web" class Handler(http.server.SimpleHTTPRequestHandler): def __init__(self, *args, **kwargs): super().__init__(*args, directory=DIRECTORY, **kwargs) def guess_type(self, path): # 先调用父类默认逻辑获取类型 mime_type, encoding = super().guess_type(path) # 针对YAML文件替换内容类型 if path.endswith('.yaml') or path.endswith('.yml'): return 'text/x-yaml', encoding return mime_type, encoding with socketserver.TCPServer(("", PORT), Handler) as httpd: print(f"serving at port {PORT}") httpd.serve_forever()
说明
- 重写
guess_type方法后,既保留了父类对其他文件类型的默认处理逻辑,又针对性地为YAML文件设置了正确的Content-Type。 - 同时支持
.yaml和.yml两种后缀,适配Helm仓库的常见文件格式。
内容的提问来源于stack exchange,提问作者wffger
相关产品推荐
相关产品推荐

