Python QueryString Parser
querystring-parser is a Python library designed for parsing URL query strings, particularly within Python and Django projects. Its key feature is the ability to correctly interpret and construct nested dictionaries from complex query string data, such as that often sent from HTML forms. The current version is 1.2.4, and its release cadence appears mature with infrequent updates.
Warnings
- gotcha Unlike Python's built-in `urllib.parse.parse_qs` which returns lists for all values and flattens nested structures (e.g., `a[b]=c` becomes `{'a[b]': ['c']}`), `querystring-parser` is specifically designed to correctly build nested dictionaries from such inputs. This difference is its primary purpose but can be a 'gotcha' if expecting standard library behavior.
- gotcha For complex query strings, especially those containing multidimensional arrays, `querystring-parser` can be significantly slower than standard parsing methods due to the overhead of constructing nested dictionaries. Benchmarks suggest similar performance for simple cases, but a performance penalty for highly nested structures.
- gotcha Multiple Python libraries exist with similar names (e.g., `django-query-string-parser`, `pyquerystring`, `querystring`). Ensure you are installing and importing `querystring-parser` (from `bernii/querystring-parser` on GitHub) to get the specific functionality for nested dictionary parsing.
- gotcha While `querystring-parser` correctly handles nested structures, general security considerations for parsing user-supplied query strings still apply. Unsanitized input, regardless of parser, can lead to vulnerabilities like Injection Attacks or Cross-Site Scripting (XSS).
Install
-
pip install querystring-parser
Imports
- parser
from querystring_parser import parser
Quickstart
from querystring_parser import parser
query_string = 'name=John%20Doe&address[city]=New%20York&address[zip]=10001&items[]=apple&items[]=banana'
parsed_data = parser.parse(query_string)
print(parsed_data)
# Expected output: {'name': 'John Doe', 'address': {'city': 'New York', 'zip': '10001'}, 'items': ['apple', 'banana']}
# Example with Django-style nested dicts (though library handles both standard and Django form data)
query_string_django = 'user.name=Alice&user.email=alice@example.com'
parsed_data_django = parser.parse(query_string_django)
print(parsed_data_django)
# Expected output: {'user': {'name': 'Alice', 'email': 'alice@example.com'}}