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

从Python CGI迁移到WSGI:获取查询参数问题

修复WSGI脚本获取请求参数的问题

问题根源

  1. GET请求的参数不会存入wsgi.input,而是直接放在WSGI环境变量environ['QUERY_STRING']中,你之前用这个方式获取是正确的;wsgi.input仅用于读取POST/PUT等请求的请求体内容。
  2. 原脚本未初始化body变量,直接执行body +=会触发NameError。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:25:21