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

替代已弃用的cgi.FieldStorage()解析POST请求失败,sys.stdin无POST变量

解决POST表单数据读取问题

你的代码核心问题是没有实际读取并解析POST请求的表单数据,只是把sys.stdin对象转成字符串输出,自然拿不到username的值。

要替代cgi.FieldStorage处理POST表单,按以下步骤修改即可:

  • 读取sys.stdin中的POST原始数据
  • 解析默认的application/x-www-form-urlencoded格式表单数据
  • 安全提取目标字段的值

修改后的完整代码:

#!/usr/bin/env python3
from string import Template
import sys
from urllib.parse import parse_qs

html = """
<!doctype html>
<html>
<head>
    <title>test</title>
    <meta charset="utf-8" />
</head>

<body>
    <form action="/tools/div/py.py" method="post" name="test_form">
    <input type="text" value="" name="username">
    <input type="submit" value="submit" name="submit">
    $result
    </form>
</body>
</html>
"""

print("Content-Type: text/html")
print()  # HTTP头与响应内容之间必须添加空行,否则浏览器无法正确解析

# 读取并解析POST数据
post_raw = sys.stdin.read()
form_data = parse_qs(post_raw)
# 安全获取username值,处理未提交的情况
username = form_data.get('username', [''])[0]

d = {
    'result': f'<p>result is: {username}</p>'
}
src = Template(html)
print(src.substitute(d))

关键修改说明:

  1. 导入urllib.parse.parse_qs:专门用来解析urlencoded格式的表单数据
  2. sys.stdin.read():读取POST请求传递的完整原始数据
  3. parse_qs(post_raw):将原始数据转成字典结构,键为字段名,值为对应的数据列表(支持多值字段)
  4. form_data.get('username', [''])[0]:安全获取username的第一个值,避免字段不存在时报错
  5. 添加空行:HTTP协议要求响应头和内容之间必须有一个空行,这是很多新手容易忽略的点

内容的提问来源于stack exchange,提问作者Marek Möhling

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:42:54