[PYTHON/REQUESTS] Retry 클래스 : HTTP 요청 오류 발생시 재시도하기
■ Retry 클래스를 사용해 HTTP 요청 오류 발생시 재시도하는 방법을 보여준다. ※ Retry 클래스의 생성자에서 total 인자는 총 재시도 카운트로 connect 인자와
■ Retry 클래스를 사용해 HTTP 요청 오류 발생시 재시도하는 방법을 보여준다. ※ Retry 클래스의 생성자에서 total 인자는 총 재시도 카운트로 connect 인자와
■ HTTPAdapter 클래스의 생성자에서 max_retries 인자를 사용해 HTTP 요청 오류 발생시 재시도하는 방법을 보여준다. ▶ main.py
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 31 32 33 34 35 |
from requests.adapters import HTTPAdapter from requests.sessions import Session def printResponse(title, response): print(title ) print(f" response : {response}" ) print(f" response.url : {response.url}" ) print(f" response.headers['content-type'] : {response.headers['content-type']}") print(f" response.encoding : {response.encoding}" ) print(f" response.status_code : {response.status_code}" ) print() def executeHTTPRequest(method, url, retryCount = 3): with Session() as session: httpAdapter = HTTPAdapter(max_retries = retryCount) session.mount("http://" , httpAdapter) session.mount("https://", httpAdapter) return session.request(method = method, url = url) response = executeHTTPRequest("get", "https://icodebroker.com") printResponse("테스트", response) """ 테스트 response : <Response [200]> response.url : https://icodebroker.com/ response.headers['content-type'] : text/html; charset=UTF-8 response.encoding : UTF-8 response.status_code : 200 """ |
▶ requirements.txt
1 2 3 4 5 6 7 |
certifi==2024.6.2 charset-normalizer==3.3.2 idna==3.7 requests==2.32.3 urllib3==2.2.2 |
※ pip
■ requests 패키지를 설치하는 방법을 보여준다. 1. 명령 프롬프트를 실행한다. 2. 명령 프롬프트에서 아래 명령을 실행한다. ▶ 실행 명령
1 2 3 |
pip install requests |
■ quote/unquote 함수를 사용해 쿼리 문자열에서 인코딩/디코딩 쿼리 문자열을 구하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
from urllib import parse sourceString = "서울" urlEncodedString = parse.quote(sourceString) urlDecodedString = parse.unquote(urlEncodedString) print(urlEncodedString) print(urlDecodedString) """ %EC%84%9C%EC%9A%B8 서울 """ |
■ urlencode 함수에서 encoding 인자를 사용해 텍스트 인코딩을 설정하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from urllib import parse queryStringList = [("value1", "서울"), ("value2", "인천")] queryStringURLEncoded = parse.urlencode(queryStringList, encoding = "UTF-8", doseq = True) print(queryStringURLEncoded) """ value1=%EC%84%9C%EC%9A%B8&value2=%EC%9D%B8%EC%B2%9C """ |
■ urlencode 함수를 사용해서 쿼리 문자열 튜플 리스트에서 URL 인코딩 쿼리 문자열을 구하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from urllib import parse queryStringList = [("value1", "서울"), ("value2", "인천")] queryStringURLEncoded = parse.urlencode(queryStringList, doseq = True) print(queryStringURLEncoded) """ value1=%EC%84%9C%EC%9A%B8&value2=%EC%9D%B8%EC%B2%9C """ |
■ urlencode 함수를 사용해 파싱된 쿼리 문자열 딕셔너리에서 URL 인코딩 쿼리 문자열을 구하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
from urllib import parse parseResult = parse.urlparse('https://icodebroker.com?value1=서울&value2=인천') queryString = parseResult.query queryStringDictionary = parse.parse_qs(queryString) urlEncodedQueryString = parse.urlencode(queryStringDictionary, doseq = True) print(urlEncodedQueryString) """ value1=%EC%84%9C%EC%9A%B8&value2=%EC%9D%B8%EC%B2%9C """ |
■ parse_qs 함수를 사용해 쿼리 문자열을 파싱해서 쿼리 문자열 딕셔너리를 구하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from urllib import parse parseResult = parse.urlparse("https://icodebroker.com?value1=서울&value2=인천") queryString = parseResult.query queryStringDictionary = parse.parse_qs(queryString) print(queryStringDictionary) """ {'value1': ['서울'], 'value2': ['인천']} """ |
■ urlparse 함수를 사용해 URL을 파싱해서 ParseResult 객체를 구하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 |
from urllib import parse parseResult = parse.urlparse('https://icodebroker.com?value1=서울&value2=인천') print(parseResult) """ ParseResult(scheme='https', netloc='icodebroker.com', path='', params='', query='value1=서울&value2=인천', fragment='') """ |
■ bs4 패키지를 설치하는 방법을 보여준다. 1. 명령 프롬프트를 실행한다. 2. 명령 프롬프트에서 아래 명령을 실행한다. ▶ 실행 명령
1 2 3 |
pip bs4 |
■ get 함수의 verify 인자를 사용해 인증서 파일을 설정하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 |
import httpx response = httpx.get(url = "https:/127.0.0.1:443", verify = "./certificate.pem") print(response.status_code) |
■ get 함수의 verify 인자를 사용해 HTTPS 인증서의 검증을 무시하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 |
import httpx response = httpx.get("https://www.daum.net", verify = False) print(response.status_code) # 200 |
■ google-search-results 패키지를 설치하는 방법을 보여준다. 1. 명령 프롬프트를 실행한다. 2. 명령 프롬프트에서 아래 명령을 실행한다. ▶ 실행 명령
1 2 3 |
pip install google-search-results |
※ SerpApi.com을
■ Request 클래스를 사용해 메소드에서 HTTP Request 객체를 직접 참조하는 방법을 보여준다. • FastAPI는 내부적으로 Starlette를 사용하고 있다. • 필요하다면 FastAPI 대신
■ curl 명령을 사용해 HTTP DELETE 요청에서 데이터 삭제를 요청하는 방법을 보여준다. 1. [명령 프롬프트]를 실행한다. 2. [명령 프롬프트]에서 아래 명령을 실행한다.
■ curl 명령을 사용해 HTTP PUT 요청에서 데이터 수정을 요청하는 방법을 보여준다. 1. [명령 프롬프트]를 실행한다. 2. [명령 프롬프트]에서 아래 명령을 실행한다.
■ curl 명령을 사용해 HTTP POST 요청에서 JWT 토큰을 포함한 신규 데이터 추가를 요청하는 방법을 보여준다. 1. [명령 프롬프트]를 실행한다. 2. [명령
■ curl 명령을 사용해 HTTP POST 요청에서 FORM 인증 방식으로 사용자 로그인하는 방법을 보여준다. 1. [명령 프롬프트]를 실행한다. 2. [명령 프롬프트]에서 아래
■ curl 명령을 사용해 HTTP POST 요청에서 신규 사용자 추가를 요청하는 방법을 보여준다. 1. [명령 프롬프트]를 실행한다. 2. [명령 프롬프트]에서 아래 명령을
■ get 함수의 data 인자를 사용해 폼 URL 인코딩 방식으로 데이터를 전달하는 방법을 보여준다. ▶ 예제 코드 (PY)
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 |
import httpx def printResponse(title, response): print(title ) print(f" response : {response}" ) print(f" response.url : {response.url}" ) print(f" response.headers['content-type'] : {response.headers['content-type']}") print(f" response.encoding : {response.encoding}" ) print(f" response.status_code : {response.status_code}" ) #print(f" response.text : {response.text}" ) print() dataDictionary = {"key1" : "value1", "key2" : "value2"} response = httpx.post("https://httpbin.org/post", data = dataDictionary) printResponse("FORM URL 인코딩 데이터 전달", response) """ FORM URL 인코딩 데이터 전달 response : <Response [200 OK]> response.url : https://httpbin.org/post response.headers['content-type'] : application/json response.encoding : ascii response.status_code : 200 """ |
■ uvicorn 패키지를 설치하는 방법을 보여준다. 1. 명령 프롬프트를 실행한다. 2. 명령 프롬프트에서 아래 명령을 실행한다. ▶ 실행 명령
1 2 3 |
pip install uvicorn |
■ FastAPI 클래스의 add_middleware 메소드를 사용해 HTTP 요청에 대해 HTTPS 리다이렉션을 설정하는 방법을 보여준다. ▶ main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import uvicorn from fastapi import FastAPI from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware fastAPI = FastAPI() fastAPI.add_middleware(HTTPSRedirectMiddleware) @fastAPI.get("/") async def getHelloWorld(): return {"message" : "Hello, World!"} if __name__ == "__main__": uvicorn.run( "main:fastAPI", host = "0.0.0.0", port = 443, reload = True, ssl_keyfile = "./certificate-private-key.pem", ssl_certfile = "./certificate.pem" ) |
▶ requirement.txt
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 31 32 33 34 35 36 37 38 |
annotated-types==0.7.0 anyio==4.4.0 certifi==2024.6.2 click==8.1.7 dnspython==2.6.1 email_validator==2.1.1 exceptiongroup==1.2.1 fastapi==0.111.0 fastapi-cli==0.0.4 h11==0.14.0 httpcore==1.0.5 httptools==0.6.1 httpx==0.27.0 idna==3.7 Jinja2==3.1.4 markdown-it-py==3.0.0 MarkupSafe==2.1.5 mdurl==0.1.2 orjson==3.10.3 pydantic==2.7.3 pydantic_core==2.18.4 Pygments==2.18.0 python-dotenv==1.0.1 python-multipart==0.0.9 PyYAML==6.0.1 rich==13.7.1 shellingham==1.5.4 sniffio==1.3.1 starlette==0.37.2 typer==0.12.3 typing_extensions==4.12.1 ujson==5.10.0 uvicorn==0.30.1 uvloop==0.19.0 watchfiles==0.22.0 websockets==12.0 |
■ FastAPI 클래스의 route 메소드를 사용해 HTTP 요청에 대해 HTTPS 리다이렉션을 설정하는 방법을 보여준다. ▶ redirect_https.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import uvicorn from fastapi import FastAPI from starlette.requests import Request from starlette.responses import RedirectResponse fastAPI = FastAPI() @fastAPI.route("/{_:path}") async def redirectHTTPS(request : Request): return RedirectResponse(request.url.replace(scheme = "https")) if __name__ == "__main__": uvicorn.run("redirect_https:fastAPI", host = "0.0.0.0", port = 80) |
▶ main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import uvicorn from subprocess import Popen from fastapi import FastAPI fastAPI = FastAPI() @fastAPI.get("/") async def getHelloWorld(): return {"message" : "Hello, World!"} if __name__ == "__main__": Popen(["python3", "-m", "redirect_https"]) uvicorn.run( "main:fastAPI", host = "0.0.0.0", port = 443, reload = True, ssl_keyfile = "./certificate-private-key.pem", ssl_certfile = "./certificate.pem" ) |
▶ requirements.py
■ run 함수의 ssl_keyfile/ssl_certfile 인자를 사용해 HTTPS를 설정하는 방법을 보여준다. ▶ main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import uvicorn from fastapi import FastAPI fastAPI = FastAPI() @fastAPI.get("/") async def getHelloWorld(): return {"message" : "Hello, World!"} if __name__ == "__main__": uvicorn.run( "main:fastAPI", host = "0.0.0.0", port = 443, reload = True, ssl_keyfile = "./certificate-private-key.pem", ssl_certfile = "./certificate.pem" ) |
▶ requirements.txt
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 31 32 33 34 35 36 37 38 |
annotated-types==0.7.0 anyio==4.4.0 certifi==2024.6.2 click==8.1.7 dnspython==2.6.1 email_validator==2.1.1 exceptiongroup==1.2.1 fastapi==0.111.0 fastapi-cli==0.0.4 h11==0.14.0 httpcore==1.0.5 httptools==0.6.1 httpx==0.27.0 idna==3.7 Jinja2==3.1.4 markdown-it-py==3.0.0 MarkupSafe==2.1.5 mdurl==0.1.2 orjson==3.10.3 pydantic==2.7.3 pydantic_core==2.18.4 Pygments==2.18.0 python-dotenv==1.0.1 python-multipart==0.0.9 PyYAML==6.0.1 rich==13.7.1 shellingham==1.5.4 sniffio==1.3.1 starlette==0.37.2 typer==0.12.3 typing_extensions==4.12.1 ujson==5.10.0 uvicorn==0.30.1 uvloop==0.19.0 watchfiles==0.22.0 websockets==12.0 |
■ FastAPI 클래스의 add_middleware 메소드를 사용해 GZIP 압축 전송을 설정하는 방법을 보여준다. ▶ main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import uvicorn from fastapi import FastAPI from fastapi.middleware.gzip import GZipMiddleware fastAPI = FastAPI() fastAPI.add_middleware(GZipMiddleware, minimum_size = 1000, compresslevel = 9) # compressionlevel 인자의 디폴트 값은 9로, 이를 낮출 경우 압축 효율은 떨어지지만 압축 속도는 빨라지게 된다. @fastAPI.get("/") async def getHelloWorld(): return {"message" : "Hello, World!"} if __name__ == "__main__": uvicorn.run("main:fastAPI", host = "0.0.0.1", port = 8000, reload = True) |
▶ requirements.txt
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 31 32 33 34 35 36 37 38 |
annotated-types==0.7.0 anyio==4.4.0 certifi==2024.6.2 click==8.1.7 dnspython==2.6.1 email_validator==2.1.1 exceptiongroup==1.2.1 fastapi==0.111.0 fastapi-cli==0.0.4 h11==0.14.0 httpcore==1.0.5 httptools==0.6.1 httpx==0.27.0 idna==3.7 Jinja2==3.1.4 markdown-it-py==3.0.0 MarkupSafe==2.1.5 mdurl==0.1.2 orjson==3.10.3 pydantic==2.7.3 pydantic_core==2.18.4 Pygments==2.18.0 python-dotenv==1.0.1 python-multipart==0.0.9 PyYAML==6.0.1 rich==13.7.1 shellingham==1.5.4 sniffio==1.3.1 starlette==0.37.2 typer==0.12.3 typing_extensions==4.12.1 ujson==5.10.0 uvicorn==0.30.1 uvloop==0.19.0 watchfiles==0.22.0 websockets==12.0 |