从BaseHTTPHandler解析HTTP GET和POST参数?
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 的话),那就可以随意使用内置的解决方案。