替换即将弃用的CGI:求无cgi.FieldStorage处理HTML表单示例
不用cgi.FieldStorage处理HTML表单的示例
一、使用multipart库处理multipart/form-data类型表单
你之前的错误是未传入MultipartParser必填的stream和boundary参数,正确用法需要从请求环境中获取请求体流和Content-Type头里的边界值:
import os import multipart # 获取请求体流(WSGI环境下对应wsgi.input) stream = os.environ['wsgi.input'] # 从Content-Type头中提取boundary参数 content_type = os.environ.get('CONTENT_TYPE', '') boundary = content_type.split('boundary=')[-1] # 初始化解析器并解析表单 parser = multipart.MultipartParser(stream, boundary) form_data = parser.parse() # 提取目标字段值 if 'number' in form_data: print(form_data['number'].value)
二、使用email库处理multipart/form-data类型表单
email.message.Message不存在parse_args方法,需用email.parser.BytesParser来解析请求体:
import os import email.parser # 读取请求体字节数据 stream = os.environ['wsgi.input'] body = stream.read() # 获取Content-Type头信息 content_type = os.environ.get('CONTENT_TYPE', '') # 解析表单数据 msg = email.parser.BytesParser().parsebytes(body) # 遍历表单部件提取字段 for part in msg.walk(): if part.is_multipart(): continue field_name = part.get_param('name', header='Content-Disposition') field_value = part.get_payload(decode=True).decode('utf-8') if field_name == 'number': print(field_value)
三、处理application/x-www-form-urlencoded类型表单
如果是普通编码的表单,直接用urllib.parse解析即可:
import os import urllib.parse # 读取并解码请求体 stream = os.environ['wsgi.input'] body = stream.read().decode('utf-8') # 解析表单数据 form_data = urllib.parse.parse_qs(body) # 提取目标字段(注意parse_qs返回值为列表) if 'number' in form_data: print(form_data['number'][0])
内容的提问来源于stack exchange,提问作者Kal
相关产品推荐
相关产品推荐

