summaryrefslogtreecommitdiff
path: root/django/utils
diff options
context:
space:
mode:
Diffstat (limited to 'django/utils')
-rw-r--r--django/utils/http.py23
1 files changed, 18 insertions, 5 deletions
diff --git a/django/utils/http.py b/django/utils/http.py
index c13f44602b..4fbb786d89 100644
--- a/django/utils/http.py
+++ b/django/utils/http.py
@@ -88,11 +88,24 @@ def urlencode(query, doseq=False):
query = query.lists()
elif hasattr(query, 'items'):
query = query.items()
- return original_urlencode(
- [(k, [str(i) for i in v] if isinstance(v, (list, tuple)) else str(v))
- for k, v in query],
- doseq
- )
+ query_params = []
+ for key, value in query:
+ if isinstance(value, (str, bytes)):
+ query_val = value
+ else:
+ try:
+ iter(value)
+ except TypeError:
+ query_val = value
+ else:
+ # Consume generators and iterators, even when doseq=True, to
+ # work around https://bugs.python.org/issue31706.
+ query_val = [
+ item if isinstance(item, bytes) else str(item)
+ for item in value
+ ]
+ query_params.append((key, query_val))
+ return original_urlencode(query_params, doseq)
def cookie_date(epoch_seconds=None):