从BaseHTTPHandler解析http GET和POST参数?

ata*_*lor 35 python http basehttpserver

来自BaseHTTPServer模块的BaseHTTPHandler似乎没有提供任何方便的方式来访问http请求参数.解析路径中的GET参数和请求体中的POST参数的最佳方法是什么?

现在,我正在使用它进行GET:

def do_GET(self):
    parsed_path = urlparse.urlparse(self.path)
    try:
        params = dict([p.split('=') for p in parsed_path[4].split('&')])
    except:
        params = {}
Run Code Online (Sandbox Code Playgroud)

这适用于大多数情况,但我想要一些更健壮的东西来正确处理编码和空参数等情况.理想情况下,我想要一些小而独立的东西,而不是一个完整的Web框架.

zag*_*zag 85

您可能想要使用urllib.parse:

>>> from urllib.parse import urlparse, parse_qs
>>> url = 'http://example.com/?foo=bar&one=1'
>>> parse_qs(urlparse(url).query)
{'foo': ['bar'], 'one': ['1']}
Run Code Online (Sandbox Code Playgroud)

对于Python 2,模块命名urlparse而不是url.parse.

  • 应该注意的是,Python 2中的urlparse不能处理编码,Python 3版本确实支持编码.另外,为了维护正确的顺序,应该使用`parse_qsl`而不是返回列表的`parse_qs`. (2认同)

Mik*_*ike 12

更好地解决旧问题:

def do_POST(self):
    length = int(self.headers.getheader('content-length'))
    field_data = self.rfile.read(length)
    fields = urlparse.parse_qs(field_data)
Run Code Online (Sandbox Code Playgroud)

这将从文档内容中提取urlencoded的POST数据,并使用正确的urldecoding将其解析为dict

  • 如果 POST 请求使用 `Transfer-Encoding: chunked`,这将不起作用。见 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Transfer-Encoding (2认同)

Wol*_*lph 5

您可以尝试使用Werkzeug模块,基础Werkzeug库不是太大,如果需要,您可以简单地提取这些代码并完成.

url_decode方法返回一个MultiDict并具有编码支持:)

urlparse.parse_qs与Werkzeug版本处理的方法相反:

  • 编码
  • 多个值
  • 排序

如果您不需要这些(或者在编码的情况下,使用Python 3),则可以随意使用内置解决方案.