티스토리 뷰

연습

[Python] Requests, Session, Hooks

onaeonae1 2022. 1. 21. 10:09

1. 간단 설명

  • python 에서 HTTP Request 에 주로 사용하는 모듈
  • 기본 모듈이 아니라서 pip install 로 깔아줘야함
  • 일반적인 HTTP Request 와 매우 비슷하게 메소드 설정, header 설정(및 쿠키 설정), body 설정 등 다 가능
  • 파이썬의 기본 라이브러리인 urllib, urllib3 의 좀 더 편한 버전으로 이해하면 될듯

2. 가장 간단한 request

  • request를 보내는 방법은 크게 2가지가 있다. (GET 메소드라고 가정)
    1. requests.get(url, **kwargs)
    2. session.get(url, **kwargs)
  • 우선 requests.get 에 대해 알아보자
  • requests.get 은 가장 기본적인 방법 말 그대로 vanilla 상태에서 요청을 보낼 때 사용한다.
    • 일단 예시는 get 으로 했는데 메소드 다른거 붙여줘서 사용할 수 있다
    • 물론 header, body, timeout 이런거 다 설정해줄 수 있다
    • 3-way handshake를 거쳐서 request를 주고 받는다고 생각하는게 편하다(=연결 유지 안됨)
    • 간단한 요청을 할 때 좋은 편 그러나 여러 한계점 존재
      • 헤더 설정 (쿠키 설정 → 특히 로그인 상태에서의 접근)
      • 매번 handshake를 하므로 keep-alive 속성을 못살려서 느림

3. Session

  • session은 위의 불편한 부분들을 해결할 때 사용할 수 있다
    • 정확하게 session의 역할을 수행한다. (연결 재사용, 상태 유지 등)
    • session = requests.Session() 으로 생성한 후 header, adapter 등을 설정가능, 유지된다
    • 만약 로그인 상태로 http request 를 보내고 싶다면 session의 쿠키에 값을 저장한 후 사용
    • 연결 재사용(keep-alive 사용) 이 가능하니깐 속도 개선이 가능함 (handshake 생략)
      • 같은 host 에 대해서 계속 연결을 주고받을 때 그냥 reqeusts.get 보다 좋다
    • 단, 유의미하게 재사용할게 아니라 매번 생성, 삭제하면 오히려 안좋음
      • 쓸 거면 계속 쓰고 아니면 불필요한 생성,삭제를 반복할 이유가 없음 무조건 손해

3-1. request vs session

  • 따라서 다음과 같이 사용하는게 베스트
    • (같은 호스트에) 연결 상태를 유지하면서 request를 보내야 한다 → Session 생성해 사용
      • 특히 header, cookie 등의 설정이 필요하다면 더더욱 써야한다
    • (여러 호스트에) 연결 상태를 유지할 것 없이 request 를 보내야 한다 → Session 생성 X

4부터는 뇌절임 우선 request, session 사용법만 알아도 무방하다

4. Hooks

  • requests.get, session.get 등으로 GET 메소드를 보내는 것이 가능하다
  • 그런데 여기 뒤에 hook 이라는걸 붙일 수 있다.
  • response 가 성공적으로 발생하면 실행되는 함수
    • 그러니깐 response에 대해 검증을 막 돌릴 수 있다고 처음에 상상함
      • 같은 호스트 확인 등등
  • 정확히 hook 는 hook_func(res:Requests.Respnose, *args, **kwargs) 의 형태를 가는 콜백함수임
    • 그러니까 일반적인 경우에는 매개변수 전달하는게 불가능함
    • respnose event 가 발생했을 시에 response를 인자로 받고 args, kwargs는 전달되지 않음
    • 그래서 공식 예제에서는 매개변수를 쓰는 것 없이 response 만 가지고 노는 걸 보여줌

  • 예시가 이러면 아무리 열심히 해봐도 response 깔짝이는 것 밖에 안되는 것 같다.
  • 매개변수를 전달해서 사용하는 방법이 없을까? 놀랍게도 있다
    • 우선 다음과 같이 해결 가능하다
hoook 콜백 함수에 대해 매개변수를 아예 고정시킨 채로 "생성" 시켜 사용하기

4-1. Factory Pattern

  • Factory Pattern은 쉽게 말해 객체의 생성을 위임하는 거
  • Class 하나에서 생성자로 객체 만드는게 일반적인 방식
    • 그러나 여러 케이스에 대응하기 어려움(아주 미세한 차이들 때문에)
    • 이 부분은 디자인 패턴이나 객체지향 쪽에 대해 좀 더 공부해서 가져와야겠다
    • 보통은 Java 쪽에서 class 에 대한 의존성을 줄이기 위해 사용하는 패턴임
    • 여러 잘 정리된 글들이 많으므로 한번 읽어보는 것을 추천 → 참조에 적어둠
    • 파이썬에서는 이런 객체지향 스러운 부분 대신 함수들 가지고 놀 때 사용해봄
      • decorator 만들 때도 이를 사용함
  • 파이썬에서 함수는 객체(Callable object)이다
  • 그러니까 이런 "객체" 를 리턴해주는 함수를 사용하면 된다
  • 우리가 필요한건 콜백 함수인데 여기에 kwargs를 넣는 것은 불가능한 상황
    • 그러니까 kwargs를 고정할 수 있는 factory 함수를 하나 만들고
    • hooks 의 호출에서 이 매개변수를 넣어서 factory 실행
    • factory 에서는 response_hook 이라는 콜백 함수를 생성하면서 origin, target_url 고정
    • origin, target_url 이 직접 콜백 함수의 매개변수로 안들어가도 고정된 채로 리턴됨

kwargs에서 값을 불러오고 response_hook에 아예 값을 고정시킨다

  • 대충 이런식으로 session.get 에서 hooks 를 사용중

hook_factory 가 response 종료 후 실행, 실제로는 콜백 함수가 리턴됨

  • 다시 정리해보자면
    1. response의 callback으로 hook_factory(**kwargs)가 실행
    2. hook_factory 는 **kwargs에서 origin, target_url 값을 가져옴
    3. 이를 response_hook이라는 객체(=함수)에 상수로 고정시킴
    4. origin, target_url이 고정된 채로 있는 의도대로의 실제 콜백 함수인 response_hook이 리턴됨

5. 참조

'연습' 카테고리의 다른 글

vscode remote ssh 막힐때  (1) 2022.08.08
netplan apply 안될때  (0) 2022.08.05
private repo add remote, clone  (0) 2021.09.09
[Python] seleniumwire 소개  (5) 2021.07.16
[Python]: black + prettier를 사용한 format시 settings.json  (0) 2021.06.02
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함