39

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 框架。

4

5 回答 5

88

您可能想使用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,模块被命名urlparseurl.parse.

于 2011-08-23T22:04:28.710 回答
16

一个老问题的更好解决方案:

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

于 2015-07-12T03:03:43.530 回答
5

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

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

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

  • 编码
  • 多个值
  • 排序

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

于 2010-03-22T05:37:29.837 回答
2

您是否调查过使用CherryPy 之类的库?它们提供了比 BaseHTTPServer 更快的方式来处理这些事情。

于 2010-03-22T05:46:13.377 回答
1

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

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

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

例如,以下代码(假设 Content-Type 标头和空白行已被打印)检查字段 name 和 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...
于 2010-03-22T06:19:22.790 回答