Requests: ๊ฐ’์ด ์—†๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ URL ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2015๋…„ 06์›” 25์ผ  ยท  32์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: psf/requests

URL ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์—๋Š” ๊ฐ’์ด ์—†๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: http://host/path/?foo ๋˜๋Š” http://host/path/?a=1&foo). ํ˜„์žฌ Requests๋Š” ์ด์— ๋Œ€ํ•œ ์ง€์›์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

In [68]: d
Out[68]: {'a': 1, 'foo': None}

In [69]: tl
Out[69]: [('a', 1), ('foo',)]

In [70]: RequestEncodingMixin._encode_params(d)
Out[70]: 'a=1'

In [71]: RequestEncodingMixin._encode_params(tl)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-71-5d4dac855108> in <module>()
----> 1 RequestEncodingMixin._encode_params(tl)

/home/f557010/jpm/local/lib/python2.7/site-packages/requests/models.pyc in _encode_params(data)
     87         elif hasattr(data, '__iter__'):
     88             result = []
---> 89             for k, vs in to_key_val_list(data):
     90                 if isinstance(vs, basestring) or not hasattr(vs, '__iter__'):
     91                     vs = [vs]

ValueError: need more than 1 value to unpack

์˜ˆ์ƒ๋˜๋Š”:

'a=1&foo'
3.0 Breaking API Change Feature Request

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

3.0์—์„œ๋Š” ๋นˆ ๋ฌธ์ž์—ด์„ =๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  32 ๋Œ“๊ธ€

๋‚˜๋Š” ์ด๊ฒƒ์—์„œ ์•ฝ๊ฐ„์˜ ๊ฐ€์น˜๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. API ์ด์œ ๋กœ ์ธํ•ด 'ํŠœํ”Œ ๋ชฉ๋ก' ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ๋งŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. @sigmavirus24?

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ (์•„์ง) ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ urllib3๊ฐ€ urlencode ์‚ฌ์šฉ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์œผ๋ฉฐ ๊ทธ๋ ‡๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค

์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์กฐ์‚ฌํ•˜๋ฉด ์ œ์•ˆ๋œ ์ž‘์—… ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. {'foo': None} ๋Š” "์ž‘๋™"ํ•˜์ง€๋งŒ ์˜ฌ๋ฐ”๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์•„๋งˆ๋„ ์šฐ๋ฆฌ๊ฐ€ ์ด์ „์— ์ด๊ฒƒ์„ ํ”ผํ•œ ์ด์œ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, RFC 3986์—๋Š” URI์˜ ์ฟผ๋ฆฌ ๋ถ€๋ถ„ ์— ๋Œ€ํ•œ ๋งค์šฐ ... ๋Š์Šจํ•œ ์ •์˜๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ œ ์ƒ๊ฐ์—๋Š” ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ _ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค_. ์ฆ‰, ์šฐ๋ฆฌ๊ฐ€ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. =/

>>> u = urlparse.urlparse('http://example.com/foo?bar')
>>> u
ParseResult(scheme='http', netloc='example.com', path='/foo', params='', query='bar', fragment='')
>>> urlparse.parse_qs(u.query)
{}
>>> urllib.urlencode({'foo': None})
'foo=None'
>>> urllib.urlencode([('foo',)])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 1336, in urlencode
    for k, v in query:
ValueError: need more than 1 value to unpack

๊ด€๋ จ: "None ๊ฐ’์˜ urlencode๋Š” 'None' ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค." โ€“ https://bugs.python.org/issue18857

@piotr-dobrogost์˜ ์ž…๋ ฅ, @agilevic ์„ ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค. ๋นˆ ๋ฌธ์ž์—ด์„ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•ด

์ถฉ๋Œ. =)

>>> import requests
>>> r = requests.get('https://httpbin.org/get', params={'foo': ''})
>>> r.request.url
'https://httpbin.org/get?foo='

๊ฐ’์ด ์—†๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. Yours๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„ ๋’ค์— = ๊ธฐํ˜ธ๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์ž‘๋™ํ•˜์ง€๋งŒ ์™„์ „ํ•œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ด ์ •ํ™•ํ•œ ๊ฒฝ์šฐ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. urllib๊ฐ€ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์€ HTTP์— ๋Œ€ํ•œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ณด๋‹ค ๋งŽ์€ ์ผ์„ ๋” ์ž˜ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ HTTP์˜ ์กด์žฌ ์ด์œ ์ž…๋‹ˆ๋‹ค.

@agilevic ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ œ์•ˆํ•œ API ๋””์ž์ธ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์—ฌ๊ธฐ ๋ฏธ์นœ ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

>>> import requests
>>> r = requests.get('https://httpbin.org/get', params={'foo': None})
>>> r.request.url
'https://httpbin.org/get?foo'

๊ทธ๊ฒƒ์ด ์ผ์–ด๋‚˜์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š” ์ผ:

'https://httpbin.org/get'

:(

@frnhr ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ API์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ํ‚ค๋ฅผ None ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด "์ง€๋„์—์„œ ์ด ํ‚ค๋ฅผ ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค"๋ผ๋Š” ์‹ ํ˜ธ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” Session ๊ฐ์ฒด ์ž์ฒด์— ์œ ์ง€๋  ์ˆ˜ ์žˆ๊ณ  ์‚ฌ์šฉ์ž๋Š” ๋•Œ๋•Œ๋กœ ์š”์ฒญ๋ณ„๋กœ ํ•ด๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์–ต์ œํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์‹ ํ˜ธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ ์„ธ์…˜ ๊ฐœ์ฒด๊ฐ€ ์ด API ๋น„ํŠธ์™€ ์–ด๋–ค ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ข‹์•„, False ์•„๋‹ˆ๋ฉด SpecialImportableObject ๋Œ€์‹  None ?

2016๋…„ 9์›” 17์ผ 07:47์— Cory Benfield [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@frnhr API์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ํ‚ค๋ฅผ None์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด "์ง€๋„์—์„œ ์ด ํ‚ค๋ฅผ ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค"๋ผ๋Š” ์‹ ํ˜ธ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” Session ๊ฐ์ฒด ์ž์ฒด์— ์œ ์ง€๋  ์ˆ˜ ์žˆ๊ณ  ์‚ฌ์šฉ์ž๋Š” ๋•Œ๋•Œ๋กœ ์š”์ฒญ๋ณ„๋กœ ํ•ด๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์–ต์ œํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์‹ ํ˜ธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ๋ณด๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐํ•˜์„ธ์š”.

@frnhr Session API๋Š” requests. API๊ฐ€ Session API ์œ„์— ๊ตฌ์ถ•๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ด€๋ จ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์ธ ํŽธ๋ฆฌํ•œ ๋ž˜ํผ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ํ™•์‹คํžˆ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์–ด๋Š ์ •๋„ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ‚ค-๊ฐ’ ๋งคํ•‘์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ params ํ•„๋“œ์— ๋ฌธ์ž์—ด์„ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. params="foo" .

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๊ฐ’ ์—†์ด ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์š”์ฒญ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ํŠน์ • ์œ ํ˜•์˜ ์ธ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

# defined somewhere in requests
class ValuelessParam(object):
    pass
....
....

params = {'foo': 'some_param', 'bar': requests.ValuelessParam()}

requests.get('http://something', params=params)

# url should be 'http://something?foo=some_param&bar'

None์ด ์•„๋‹ˆ๊ณ , ์Šค์นผ๋ผ ์ƒ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค... ๊ทธ๋ž˜์„œ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ... ํ•ด๋‹น ๊ฐ’ ์œ ํ˜•์„ ํ™•์ธํ•˜๊ณ  ํŠน๋ณ„ํžˆ ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑ๋œ URL์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ™•์‹คํžˆ ์ž‘๋™ํ•˜์ง€๋งŒ API๊ฐ€ Kenneth๋ฅผ ์ง€๋‚˜์น  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์•„๋‹ˆ์š”. None ์™€ ๊ฐ™์€ ๋‚ด์žฅ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ตœ์„ ์˜ ์•„์ด๋””์–ด์ธ์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ž˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. False ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

None ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฒ ์ด์Šค๋Š” ์ด๋ฏธ "์„ธ์…˜ ์ˆ˜์ค€์—์„œ ์„ค์ •๋œ ๊ฐ’ ์„ค์ • ํ•ด์ œ"์˜ ์˜๋ฏธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๊ฝค ํฐ ๋ณ€ํ™”๊ฐ€ ๋  ๊ฒƒ์ด๋ฉฐ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋นˆ ํŠœํ”Œ์ด ๊ณ ๋ ค๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์˜ˆ: (,) .

์ด๊ฒƒ์ด ํ•ด๊ฒฐ๋˜์—ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์ด ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ’ ์—†์ด ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ •ํ™•ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” "QueryAll"์ด์ง€๋งŒ RestAPI ์ž๋™ํ™”์—์„œ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์›์ธ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

{'QueryAll': ''} ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” &QueryAll= ์„ ์–ป์Šต๋‹ˆ๋‹ค.

์—ด๋ฆฐ "="์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ API์— ๋‹ฌ๋ ค์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ PasswordState์˜ API๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก์˜ ๋์— ์žˆ๋Š” ํ•œ ๊ทธ๊ฒƒ์„ ์ฒ˜์Œ์œผ๋กœ ์ด๋™ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

3.0์—์„œ๋Š” ๋นˆ ๋ฌธ์ž์—ด์„ =๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋‹จํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค :-D ์ง€๊ธˆ๊นŒ์ง€ ๋‚ด Passwordstate ํ”„๋กœ์ ํŠธ๋Š” teh params ๋ฌธ์ž์—ด์˜ ๋์— QueryAll= ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์‹œ ์›๋ž˜๋Œ€๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ๋ฅผ ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค :-D

๊ณ ๋งˆ์›Œ ์ผ€๋„ค์Šค!

์•„์ง ๋“ฃ๊ฑฐ๋‚˜ ๋ณธ ์ ์ด ์—†์ง€๋งŒ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฆด๋ฆฌ์Šค๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋Œ์•„๋‹ค๋‹ˆ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ƒˆ๊ธด โ€‹โ€‹๊ธˆ

๋ณด๋‚ธ ์‚ฌ๋žŒ: Alex Zagoro [email protected]
๋ณด๋ƒ„: 2018๋…„ 9์›” 22์ผ ํ† ์š”์ผ ์˜ค์ „ 10:19
๋ฐ›๋Š” ์‚ฌ๋žŒ: ์š”์ฒญ/์š”์ฒญ [email protected]
์ฐธ์กฐ: Ellson, Nick [email protected] ; ๋Œ“๊ธ€ [email protected]
์ œ๋ชฉ: Re: [requests/requests] ๊ฐ’์ด ์—†๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ URL ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์—†์Œ(#2651)

์ด๋ด, ์ด๊ฒƒ์— ๋Œ€ํ•œ ์–ด๋–ค ์—…๋ฐ์ดํŠธ?

๋‚˜๋Š” ํ˜„์žฌ๋„์ด ๋ฌธ์ œ์— ์ง๋ฉด ํ•ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?

์ด ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์š”์ฒญ์—๋Š” ์—ฌ์ „ํžˆ ์†”๋ฃจ์…˜์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์ด ํ•œ.

๋ถˆํ–‰ํžˆ๋„ ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค.
None ๋™์ž‘์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์„ ํƒ์  ์‚ฌ์šฉ์ž ์ง€์ • ํฌ๋งทํ„ฐ/์ธ์ฝ”๋” ๋˜๋Š” ํŠน์ • ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฝ์ž…/์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ํŒจํ„ด์ด๋‚˜ ์˜ต์…˜์ด ์•„๋‹๊นŒ์š”?

@Lukasa ๋‹น์‹ ์€ ์šฐ๋ฆฌ๋ณด๋‹ค ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋” ์ž˜ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ

๊ทธ๊ฒƒ์ด ํ•ต์‹ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์•„๋‹Œ @kennethreitz์—์„œ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์„๊นŒ์š”? ๊ธฐ๋ณธ๊ฐ’์€ 2.x ๋™์ž‘์„ ๋ชจ๋ฐฉํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋นˆ ๋ฌธ์ž์—ด์ด ์ „๋‹ฌ๋  ๋•Œ ์—ฌ์ „ํžˆ =๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ฐ•๊ตฌํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค!

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

๊ฐ’์ด ์—†๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ URL์˜ ์ผ๋ถ€๋กœ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ถ”๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ? ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋Œ€์‹  & ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

In [3]: r = requests.get("http://www.google.com", params={'test': 'true'})

In [4]: r.url
Out[4]: 'http://www.google.com/?test=true'

In [5]: r = requests.get("http://www.google.com?test2", params={'test': 'true'})

In [6]: r.url
Out[6]: 'http://www.google.com/?test2&test=true'

์ด ๊ทœ์น™์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

{ key: undefined } ~ ? _(ํฌํ•จ๋˜์ง€ ์•Š์Œ)_
{ key: null } ~ ?key
{ key: '' } ~ ?key=
{ key: 'null' } ~ ?key=null

2020๋…„... ๊ทธ๋ฆฌ๊ณ  ์—ฌ์ „ํžˆ ๋ฌธ์ œ.... SMH

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰