替代已弃用的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))
关键修改说明:
- 导入
urllib.parse.parse_qs:专门用来解析urlencoded格式的表单数据 sys.stdin.read():读取POST请求传递的完整原始数据parse_qs(post_raw):将原始数据转成字典结构,键为字段名,值为对应的数据列表(支持多值字段)form_data.get('username', [''])[0]:安全获取username的第一个值,避免字段不存在时报错- 添加空行:HTTP协议要求响应头和内容之间必须有一个空行,这是很多新手容易忽略的点
内容的提问来源于stack exchange,提问作者Marek Möhling
相关产品推荐
相关产品推荐

