티스토리 뷰
1. 간단 설명
- python 에서 HTTP Request 에 주로 사용하는 모듈
- 기본 모듈이 아니라서 pip install 로 깔아줘야함
- 일반적인 HTTP Request 와 매우 비슷하게 메소드 설정, header 설정(및 쿠키 설정), body 설정 등 다 가능
- 파이썬의 기본 라이브러리인 urllib, urllib3 의 좀 더 편한 버전으로 이해하면 될듯
2. 가장 간단한 request
- request를 보내는 방법은 크게 2가지가 있다. (GET 메소드라고 가정)
- requests.get(url, **kwargs)
- 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
- (같은 호스트에) 연결 상태를 유지하면서 request를 보내야 한다 → Session 생성해 사용
4부터는 뇌절임 우선 request, session 사용법만 알아도 무방하다
4. Hooks
- requests.get, session.get 등으로 GET 메소드를 보내는 것이 가능하다
- 그런데 여기 뒤에 hook 이라는걸 붙일 수 있다.
- response 가 성공적으로 발생하면 실행되는 함수
- 그러니깐 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 이 직접 콜백 함수의 매개변수로 안들어가도 고정된 채로 리턴됨

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

- 다시 정리해보자면
- response의 callback으로 hook_factory(**kwargs)가 실행
- hook_factory 는 **kwargs에서 origin, target_url 값을 가져옴
- 이를 response_hook이라는 객체(=함수)에 상수로 고정시킴
- 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
링크
TAG
- 불필요한 값 무시하기
- Til
- 우선순위큐
- SQL
- cipher suite
- endl을절대쓰지마
- factory_pattern
- 삽질
- Javascript
- docker-compose update
- 위상정렬
- requests
- django test
- 코딩테스트
- 최대한 간략화하기
- 힙
- 파이썬
- 프로그래머스
- 스택
- 백준
- Event Sourcing
- SSL
- 그리디
- Remote
- django testcase
- BOJ
- jwt
- Python
- 이것도모르면바보
- vscode
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함