Requests: μƒνƒœ μ½”λ“œκ°€ 200κ³Ό 같지 μ•ŠμœΌλ©΄ μ˜ˆμ™Έ λ°œμƒ

에 λ§Œλ“  2014λ…„ 07μ›” 27일  Β·  3μ½”λ©˜νŠΈ  Β·  좜처: psf/requests

μ•ˆλ…•ν•˜μ„Έμš”,
λ‚˜λŠ” μ’…μ’… μš”μ²­μ΄ μƒνƒœ μ½”λ“œ 200을 κ°€μ§ˆ κ²ƒμœΌλ‘œ μ˜ˆμƒν•˜κ³  그것이 μ—†μœΌλ©΄ λ‚΄κ°€ ν•  수 μžˆλŠ” 일이 λ³„λ‘œ μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λ‹€μŒκ³Ό 같은 μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    r = requests.get(self.url(False))
    if r.status_code != 200:
        raise requests.ConnectionError("Expected status code 200, but got {}".format(page.status_code))

λ‚˜λŠ” allowed_status_codesλΌλŠ” kwargκ°€ 맀우 νŽΈλ¦¬ν•  것이라고 μƒκ°ν•©λ‹ˆλ‹€. λ‹€μŒκ³Ό 같이 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
기본적으둜 None μž…λ‹ˆλ‹€. None , 빈 λͺ©λ‘ λ˜λŠ” νŠœν”Œμ€ λͺ¨λ“  μƒνƒœ μ½”λ“œ ν—ˆμš©μ„ μ˜λ―Έν•©λ‹ˆλ‹€. μ •μˆ˜, λͺ©λ‘, νŠœν”Œ λ˜λŠ” μ—΄κ±°ν˜•μΌ 수 μžˆμŠ΅λ‹ˆλ‹€. μ •μˆ˜μΈ 경우 이 νŠΉμ • μƒνƒœ μ½”λ“œλ§Œ ν—ˆμš©ν•©λ‹ˆλ‹€. λͺ©λ‘ λ˜λŠ” νŠœν”ŒμΈ 경우 λͺ©λ‘/νŠœν”Œ 내뢀에 μžˆλŠ” μƒνƒœ μ½”λ“œλ§Œ ν—ˆμš©λ©λ‹ˆλ‹€. λͺ©λ‘μ—λŠ” μ •μˆ˜ 및/λ˜λŠ” μ—΄κ±°ν˜•μ΄ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. μ—΄κ±°ν˜•μ€ 쑰금 더 μœ μ—°ν•΄μ•Ό ν•©λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄ λͺ¨λ“  "성곡적인"(2xx) μš”μ²­μ„ ν—ˆμš©ν•˜λ €λ©΄ λ‹€μŒκ³Ό 같이 μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ„œλ²„ 였λ₯˜λ§Œ ν—ˆμš©ν•˜μ§€ μ•Šκ³ (λ”°λΌμ„œ μΈμ¦λ˜μ§€ μ•Šμ€ 였λ₯˜λ₯Ό μ²˜λ¦¬ν•˜λ €λŠ” 경우) κ°„λ‹¨νžˆ allowed_status_codes=requests.DISALLOW_SERVER_ERRORλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그러면 μ„œλ²„ μ½”λ“œκ°€ 5xx인 경우 μ˜ˆμ™Έκ°€ λ°œμƒν•©λ‹ˆλ‹€.
λ¬Όλ‘  νŠΉμ • 사둀λ₯Ό λ‹€λ£¨λŠ” μ—΄κ±°ν˜•μ΄ 많이 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. 그리고 λͺ©λ‘ λ‚΄μ—μ„œ κ²°ν•©ν•˜μ—¬ μ‚¬μš©ν•  μˆ˜λ„ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€(예: (200, ALLOW_REDIRECTIONS) ).
μƒνƒœ μ½”λ“œκ°€ ν—ˆμš©λ˜μ§€ μ•ŠμœΌλ©΄ StatusCodeError(RequestException) κ°€ λ°œμƒν•©λ‹ˆλ‹€.


μ—΄κ±°ν˜•μ— λŒ€ν•΄ μ–ΈκΈ‰ν–ˆμ§€λ§Œ Python 3.4의 μ—΄κ±°ν˜• 값에 λŒ€ν•΄ λ§ν•˜λŠ” 것이 μ•„λ‹™λ‹ˆλ‹€. λ‚˜λŠ” 였히렀 μƒμˆ˜μ— λŒ€ν•΄ μ΄μ•ΌκΈ°ν•˜κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€. μ—΄κ±°ν˜•(μƒμˆ˜)은 λ‹€μŒκ³Ό 같이 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

#request model.

ALLOW_SUCCESS = AllowSuccessEnum()
# other enums

class RequestEnum(object):
     def is_status_code_allowed(status_code):
         raise NotImplementedError

class AllowSuccessEnum(RequestEnum):
    def is_status_code_allowed(status_code):
        # return false unless status code is 2xx

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ˜ν•œ 각 Response μ—λŠ” μƒνƒœ μ½”λ“œκ°€ 200이 μ•„λ‹Œ 경우 μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” raise_for_status λ©”μ„œλ“œκ°€ μžˆμ§€ μ•ŠμŠ΅λ‹ˆκΉŒ?

Python 2.7.7 (default, Jun  2 2014, 18:55:26)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> r = requests.get('http://httpbin.org/404')
>>> r
<Response [404]>
>>> r.raise_for_status()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/requests/models.py", line 795, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 404 Client Error: NOT FOUND

λͺ¨λ“  3 λŒ“κΈ€

이 아이디어λ₯Ό μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

이것이 μš”μ²­ μžμ²΄μ— μ†ν•˜λŠ” μ΄μœ λŠ” λΆ„λͺ…ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•„μš”ν•œ μ½”λ“œλŠ” λ³΅μž‘ν•˜μ§€ μ•ŠμœΌλ©° λΌμ΄λΈŒλŸ¬λ¦¬μ— 이 μ½”λ“œλ₯Ό λ³΄μœ ν•¨μœΌλ‘œμ¨ λ§Žμ€ κ°€μΉ˜λ₯Ό μΆ”κ°€ν•  것이라고 μƒκ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μš°λ¦¬λŠ” API에 λ‹€λ₯Έ ν‚€μ›Œλ“œ 인수λ₯Ό μΆ”κ°€ _ν• _ κ²ƒμž…λ‹ˆλ‹€. μ΄λŠ” μš°λ¦¬κ°€ λŒ€λΆ€λΆ„μ˜ μ‹œκ°„μ— ν•˜κΈ°λ₯Ό κΊΌλ¦¬λŠ” κ²ƒμž…λ‹ˆλ‹€.

λ˜ν•œ 각 Response μ—λŠ” μƒνƒœ μ½”λ“œκ°€ 200이 μ•„λ‹Œ 경우 μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” raise_for_status λ©”μ„œλ“œκ°€ μžˆμ§€ μ•ŠμŠ΅λ‹ˆκΉŒ?

Python 2.7.7 (default, Jun  2 2014, 18:55:26)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> r = requests.get('http://httpbin.org/404')
>>> r
<Response [404]>
>>> r.raise_for_status()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/requests/models.py", line 795, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 404 Client Error: NOT FOUND

@Lukasa 맀우 νŽΈλ¦¬ν•˜κΈ° λ•Œλ¬Έμ— λ§Žμ€ μ½”λ“œλ₯Ό μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€ (ν”„λ‘œμ νŠΈκ°€ μš”μ²­μ„ μ‚¬μš©ν•œλ‹€κ³  κ°€μ • ν•΄ λ΄…μ‹œλ‹€. 이 ν”„λ‘œμ νŠΈλŠ” μš”μ²­μ„ μ•½ 100 번 μ‚¬μš©ν•©λ‹ˆλ‹€. λ”°λΌμ„œ 200 μ€„μ˜ μ½”λ“œλ₯Ό μ €μž₯ν•˜κ³  μž‘μ„±ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— μ˜€νƒ€λ₯Ό 방지 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ˜ˆμ™Έλ₯Ό 100회(μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” 방법을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우)ν•˜κ³  μ˜ˆμ™Έ/였λ₯˜λ₯Ό ν†΅ν•©ν•©λ‹ˆλ‹€(λ‹€λ₯Έ APIκ°€ μš”μ²­μ„ μ‚¬μš©ν•˜κ³  잘λͺ»λœ μƒνƒœ μ½”λ“œμ˜ 경우 μ‚¬μš©μž 지정 였λ₯˜λ₯Ό μΌμœΌν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€. μš”μ²­κ³Ό λ™μΌν•œ μ˜ˆμ™Έκ°€ λ°œμƒν•¨).

@sigmavirus24 μ£„μ†‘ν•©λ‹ˆλ‹€. 이 방법이 μžˆλŠ”μ§€ λͺ°λžμŠ΅λ‹ˆλ‹€. λ¬Έμ„œμ˜ 였λ₯˜ 및 μ˜ˆμ™Έ μ„Ήμ…˜μ—μ„œ raise_for_status에 μ˜ν•΄ HTTPErrorκ°€ λ°œμƒν•  수 μžˆμŒμ„ μ–ΈκΈ‰ν•΄μ•Ό ν•©λ‹ˆλ‹€. HTTPErrorλŠ” ν˜„μž¬ "μœ νš¨ν•˜μ§€ μ•Šμ€ HTTP μ‘λ‹΅μ˜ λ“œλ¬Έ 경우"만 λ°œμƒν•œλ‹€κ³  μ£Όμž₯ν•©λ‹ˆλ‹€.
λ‹€λ₯Έ μƒνƒœ μ½”λ“œλ„ ν—ˆμš©ν•  수 μžˆλ„λ‘ λ‚΄ 아이디어 쀑 일뢀λ₯Ό λ‚΄ raise_for_status에 κ΅¬ν˜„ν•˜λŠ” 것을 κ³ λ €ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰