从BaseHTTPHandler解析http GET和POST参数?

时间:2010-03-22 05:32:24

标签: 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 = {}

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

5 个答案:

答案 0 :(得分:84)

您可能想要使用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

答案 1 :(得分:12)

更好地解决旧问题:

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数据,并使用正确的urldecoding解析它为dict

答案 2 :(得分:6)

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

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

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

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

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

答案 3 :(得分:2)

您是否曾调查使用CherryPy等库?它们提供了比BaseHTTPServer更快的处理这些东西的途径。

答案 4 :(得分:2)

CGI module中提供了基本的HTTP请求参数支持。 处理表单数据的推荐机制是cgi.FieldStorage类。

  

要获取提交的表单数据,最好使用FieldStorage类。提供此模块中定义的其他类主要是为了向后兼容。只需实例化一次,不带参数。这将从标准输入或环境中读取表单内容(取决于根据CGI标准设置的各种环境变量的值)。由于它可能消耗标准输入,因此只应实例化一次。

     

FieldStorage实例可以像Python字典一样编入索引。它允许使用in运算符进行成员资格测试,并且还支持标准字典方法keys()和内置函数len()。包含空字符串的表单字段将被忽略,并且不会出现在字典中;要保留这些值,请在创建FieldStorage实例时为可选的keep_blank_values关键字参数提供真值。

     

例如,以下代码(假定已打印Content-Type标题和空行)检查字段名称和addr是否都设置为非空字符串:

form = cgi.FieldStorage()
if "name" not in form or "addr" not in form:
    print "<H1>Error</H1>"
    print "Please fill in the name and addr fields."
    return
print "<p>name:", form["name"].value
print "<p>addr:", form["addr"].value
#...further form processing here...