Python3运行http.server服务时浏览器不渲染HTML仅显示源码
问题原因
你直接在终端运行脚本时,是手动触发Python解释器执行代码,所以能正常打印渲染后的HTML。但python3 -m http.server默认启动的是纯静态文件服务器,没有执行服务端脚本的能力,收到任意文件请求时只会直接读取文件源码返回给浏览器,不会运行你的Python代码,自然也不会渲染Jinja2模板。
解决步骤
按以下配置调整即可正常运行:
- 调整项目目录结构,将可执行的Python脚本放到
cgi-bin目录下,这是HTTP服务识别CGI脚本的默认目录,调整后结构如下:项目根目录/ ├── cgi-bin/ │ └── home.py # 你的脚本文件 └── templates/ └── home.html # Jinja2模板文件 - 给脚本添加可执行权限,Linux/macOS系统在项目根目录执行以下命令:
Windows系统无需执行该步骤,确认chmod +x cgi-bin/home.py.py后缀文件默认关联Python 3解释器即可。 - 启动服务时添加
--cgi参数,开启CGI脚本执行能力,启动命令为:python3 -m http.server 8000 --cgi - 访问时不要直接请求根路径下的py文件,要访问CGI脚本路径:
http://localhost:8000/cgi-bin/home.py,此时服务会自动执行home.py脚本,返回渲染完成的HTML内容。
注意事项
- 你现有脚本中
print('Content-type: text/html\n')的写法是符合CGI规范的:print语句会自动追加一个换行,加上字符串里自带的换行,刚好会在响应头和响应正文之间输出要求的空行,这部分无需修改。 - 启动http.server服务时的工作目录必须是项目根目录,否则脚本里的相对路径
templates会找不到对应模板文件。 - 如果你需要更灵活的路由、模板渲染能力,后续可以换用Flask、FastAPI这类轻量Web框架,不需要手动处理CGI相关配置,开发效率更高。
内容的提问来源于stack exchange,提问作者CuriousDev
相关产品推荐
相关产品推荐

