keep_blank_values=True when parsing query_string, closes #1551

Refs #1518
pull/1554/head
Simon Willison 2021-12-12 12:01:51 -08:00
rodzic 492f9835aa
commit a6ff123de5
3 zmienionych plików z 20 dodań i 9 usunięć

Wyświetl plik

@ -97,7 +97,7 @@ class Request:
@property
def args(self):
return MultiParams(parse_qs(qs=self.query_string))
return MultiParams(parse_qs(qs=self.query_string, keep_blank_values=True))
@property
def actor(self):

Wyświetl plik

@ -393,21 +393,16 @@ class TableView(RowTableShared):
nocount = True
nofacet = True
# Ensure we don't drop anything with an empty value e.g. ?name__exact=
args = MultiParams(
urllib.parse.parse_qs(request.query_string, keep_blank_values=True)
)
# Special args start with _ and do not contain a __
# That's so if there is a column that starts with _
# it can still be queried using ?_col__exact=blah
special_args = {}
other_args = []
for key in args:
for key in request.args:
if key.startswith("_") and "__" not in key:
special_args[key] = args[key]
special_args[key] = request.args[key]
else:
for v in args.getlist(key):
for v in request.args.getlist(key):
other_args.append((key, v))
# Handle ?_filter_column and redirect, if present

Wyświetl plik

@ -121,3 +121,19 @@ def test_request_properties(path, query_string, expected_full_path):
assert request.path == path
assert request.query_string == query_string
assert request.full_path == expected_full_path
def test_request_blank_values():
query_string = "a=b&foo=bar&foo=bar2&baz="
path_with_query_string = "/?" + query_string
scope = {
"http_version": "1.1",
"method": "POST",
"path": "/",
"raw_path": path_with_query_string.encode("latin-1"),
"query_string": query_string.encode("latin-1"),
"scheme": "http",
"type": "http",
}
request = Request(scope, None)
assert request.args._data == {"a": ["b"], "foo": ["bar", "bar2"], "baz": [""]}