分析BaseHTTPHandler中的http GET和POST参数?

2024-05-14 06:30:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

现在,我用这个来获取:

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

这适用于大多数情况,但我希望有更健壮的东西来正确处理编码和空参数之类的情况。理想情况下,我想要一个小而独立的东西,而不是一个完整的web框架。


Tags: 模块path方法self路径http参数get
3条回答

您可能需要使用^{}

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

对于Python 2,模块名为^{},而不是url.parse

您可以尝试Werkzeug模块,基本的Werkzeug库不太大,如果需要的话,您可以简单地提取这段代码,就完成了。

url_decode方法返回MultiDict并支持编码:)

urlparse.parse_qs方法相反,Werkzeug版本负责:

  • 编码
  • 多重值
  • 排序顺序

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

更好地解决一个老问题:

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

这将从文档内容中提取urlencoded POST数据,并用适当的urldeconding将其解析为dict

相关问题 更多 >