从Python CGI迁移到WSGI:获取查询参数问题
修复WSGI脚本获取请求参数的问题
问题根源
- GET请求的参数不会存入
wsgi.input,而是直接放在WSGI环境变量environ['QUERY_STRING']中,你之前用这个方式获取是正确的;wsgi.input仅用于读取POST/PUT等请求的请求体内容。 - 原脚本未初始化
body变量,直接执行body +=会触发NameError。 urlparse的params属性并非用于解析表单参数,它对应URL路径中的分号分隔参数(比如/path;key=value里的内容),和GET/POST表单参数无关。
修正后的脚本
下面是同时支持GET参数和POST表单参数(application/x-www-form-urlencoded类型)的版本:
#!/usr/bin/env python3 from wsgiref.handlers import CGIHandler from urllib.parse import parse_qs def app2(environ, start_response): status = '200 OK' headers = [('Content-type', 'text/plain')] start_response(status, headers) body = [] # 处理GET参数 get_params = parse_qs(environ['QUERY_STRING']) body.append(f"GET 参数: {str(get_params)}\n") # 处理POST表单参数(仅当Content-Type为application/x-www-form-urlencoded时) content_type = environ.get('CONTENT_TYPE', '') if content_type.startswith('application/x-www-form-urlencoded'): content_length = int(environ.get('CONTENT_LENGTH', 0)) post_data = environ['wsgi.input'].read(content_length).decode('utf-8') post_params = parse_qs(post_data) body.append(f"POST 参数: {str(post_params)}\n") # 拼接所有内容并返回 return [''.join(body).encode('utf-8')] if __name__ == "__main__": CGIHandler().run(app2)
关键说明
- 用
parse_qs直接解析QUERY_STRING就能得到GET参数,无需通过urlparse绕路。 - 处理POST请求时,先判断
CONTENT_TYPE,再通过CONTENT_LENGTH读取对应长度的请求体,最后用parse_qs解析表单数据。 - 初始化
body为列表,用append拼接内容比字符串累加更高效。
内容的提问来源于stack exchange,提问作者Bill Pearson
相关产品推荐
相关产品推荐

