Mercurial > repos > guerler > springsuite
comparison planemo/lib/python3.7/site-packages/requests_toolbelt/utils/formdata.py @ 1:56ad4e20f292 draft
"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author | guerler |
---|---|
date | Fri, 31 Jul 2020 00:32:28 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:d30785e31577 | 1:56ad4e20f292 |
---|---|
1 # -*- coding: utf-8 -*- | |
2 """Implementation of nested form-data encoding function(s).""" | |
3 from .._compat import basestring | |
4 from .._compat import urlencode as _urlencode | |
5 | |
6 | |
7 __all__ = ('urlencode',) | |
8 | |
9 | |
10 def urlencode(query, *args, **kwargs): | |
11 """Handle nested form-data queries and serialize them appropriately. | |
12 | |
13 There are times when a website expects a nested form data query to be sent | |
14 but, the standard library's urlencode function does not appropriately | |
15 handle the nested structures. In that case, you need this function which | |
16 will flatten the structure first and then properly encode it for you. | |
17 | |
18 When using this to send data in the body of a request, make sure you | |
19 specify the appropriate Content-Type header for the request. | |
20 | |
21 .. code-block:: python | |
22 | |
23 import requests | |
24 from requests_toolbelt.utils import formdata | |
25 | |
26 query = { | |
27 'my_dict': { | |
28 'foo': 'bar', | |
29 'biz': 'baz", | |
30 }, | |
31 'a': 'b', | |
32 } | |
33 | |
34 resp = requests.get(url, params=formdata.urlencode(query)) | |
35 # or | |
36 resp = requests.post( | |
37 url, | |
38 data=formdata.urlencode(query), | |
39 headers={ | |
40 'Content-Type': 'application/x-www-form-urlencoded' | |
41 }, | |
42 ) | |
43 | |
44 Similarly, you can specify a list of nested tuples, e.g., | |
45 | |
46 .. code-block:: python | |
47 | |
48 import requests | |
49 from requests_toolbelt.utils import formdata | |
50 | |
51 query = [ | |
52 ('my_list', [ | |
53 ('foo', 'bar'), | |
54 ('biz', 'baz'), | |
55 ]), | |
56 ('a', 'b'), | |
57 ] | |
58 | |
59 resp = requests.get(url, params=formdata.urlencode(query)) | |
60 # or | |
61 resp = requests.post( | |
62 url, | |
63 data=formdata.urlencode(query), | |
64 headers={ | |
65 'Content-Type': 'application/x-www-form-urlencoded' | |
66 }, | |
67 ) | |
68 | |
69 For additional parameter and return information, see the official | |
70 `urlencode`_ documentation. | |
71 | |
72 .. _urlencode: | |
73 https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode | |
74 """ | |
75 expand_classes = (dict, list, tuple) | |
76 original_query_list = _to_kv_list(query) | |
77 | |
78 if not all(_is_two_tuple(i) for i in original_query_list): | |
79 raise ValueError("Expected query to be able to be converted to a " | |
80 "list comprised of length 2 tuples.") | |
81 | |
82 query_list = original_query_list | |
83 while any(isinstance(v, expand_classes) for _, v in query_list): | |
84 query_list = _expand_query_values(query_list) | |
85 | |
86 return _urlencode(query_list, *args, **kwargs) | |
87 | |
88 | |
89 def _to_kv_list(dict_or_list): | |
90 if hasattr(dict_or_list, 'items'): | |
91 return list(dict_or_list.items()) | |
92 return dict_or_list | |
93 | |
94 | |
95 def _is_two_tuple(item): | |
96 return isinstance(item, (list, tuple)) and len(item) == 2 | |
97 | |
98 | |
99 def _expand_query_values(original_query_list): | |
100 query_list = [] | |
101 for key, value in original_query_list: | |
102 if isinstance(value, basestring): | |
103 query_list.append((key, value)) | |
104 else: | |
105 key_fmt = key + '[%s]' | |
106 value_list = _to_kv_list(value) | |
107 query_list.extend((key_fmt % k, v) for k, v in value_list) | |
108 return query_list |