从BaseHTTPHandler解析HTTP GET和POST参数?

39 投票
5 回答
72142 浏览
提问于 2025-04-15 20:41

BaseHTTPHandler来自BaseHTTPServer模块,似乎没有提供方便的方法来获取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 = {}

这个方法在大多数情况下都能用,但我希望有一个更强大的解决方案,能够正确处理编码和像空参数这样的情况。理想情况下,我希望能有一个小巧独立的工具,而不是一个完整的网络框架。

5 个回答

17

对一个老问题的更好解决方案(更新版):

Python 3:

def do_POST(self):
  length = int(self.headers.get('content-length'))
  field_data = self.rfile.read(length)
  fields = parse.parse_qs(str(field_data,"UTF-8"))

示例代码:公开示例

Python 2.x:

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

这个代码会从文档内容中提取经过URL编码的POST数据,并将其解析成一个字典,同时进行正确的URL解码。

89

你可能想要使用 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']}

对于 Python 2,这个模块叫做 urlparse,而不是 url.parse

5

你可以试试 Werkzeug 这个模块。Werkzeug库本身不大,如果需要的话,你可以简单地提取这部分代码,就可以用了。

url_decode 这个方法会返回一个 MultiDict,并且支持编码哦 :)

urlparse.parse_qs 方法相比,Werkzeug 版本处理了以下几个方面:

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

如果你不需要这些功能(或者在编码方面,使用 Python 3 的话),那就可以随意使用内置的解决方案。

撰写回答