ChangHyeon Nam's Blog notes and thoughts

Session object in requests module

Comments

Session Objects

Session object은 requests에 대해 특정한 parameters를 persist하게 만들어 준다. 또한 Session instance로부터 만들어진 모든 requests에 대한 cookie들도 persist하게 해준다.

Session object을 사용하여 같은 host로부터 여러 requests를 할때, 동일한 TCP connection을 재사용할 수 있다. 이는 큰 성능 향상을 보일 수 있다. 다음 예시는 requests에 대해 cookie를 persist하는 코드이다.

import requests

s = requests.Session()
s.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get('https://httpbin.org/cookies')
print(r.text)
# {
#   "cookies": {
#     "sessioncookie": "123456789"
#   }
# }

또한 Session은 request method에 대해 default data를 제공할 때도 사용할 수 있다. Session object에 property에 대한 값을 전달하는 방식으로 구현된다. Session-level로 전달된 dictionary는 request method에 merge된다. method-level로 전달된 parameter는 session parameter에 override된다. method-level로 전달된 것은 session 사용 유무에 상관없이 persist하지 않다. 다음 예시를 보면 확인할 수 있다.

s = requests.Session()
s.auth = ('user', 'pass')
s.headers.update({'x-test': 'true'})

# both 'x-test' and 'x-test2' are sent
s.get('https://httpbin.org/headers', headers={'x-test2':'true'})
print(s.headers)
s.headers.update({'x-test2': 'true'})
print(s.headers)
# {'User-Agent': 'python-requests/2.27.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'x-test': 'true'}
# {'User-Agent': 'python-requests/2.27.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive', 'x-test': 'true', 'x-test2': 'true'}

다음 예시에서도 method-level로 전달된 dict은 persist하지 않은것을 확인할 수 있다. 첫번째 request로 전달된 cookie만 출력된다.

r = s.get('https://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(r.text)
# '{"cookies": {"from-my": "browser"}}'

r = s.get('https://httpbin.org/cookies')
print(r.text)
# '{"cookies": {}}'

Session.cookies를 사용하여 session-level로 전달된 dict은 persist한 것을 확인할 수 있다.

s.cookies.update({'cookie':'1234'})
print(s.cookies)
r = s.get('https://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(r.text)
# <RequestsCookieJar[<Cookie cookie=1234 for />]>
# {
#   "cookies": {
#     "cookie": "1234",
#     "from-my": "browser"
#   }
# }

Session object을 사용하면, Python Requests and persistent sessions 와 같은 상황에서 website에 login하기 위해 data를 submit한 다음에, subsequent한 request로 session key를 받을 수 있다.


reference

  1. Session Objects