Skip to content

Commit

Permalink
refactor: refactor proxies http request utils
Browse files Browse the repository at this point in the history
  • Loading branch information
AmooHashem committed Jan 13, 2025
1 parent c17c6b3 commit 2ac062d
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 68 deletions.
3 changes: 3 additions & 0 deletions manage_content_service/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -273,3 +273,6 @@ def get_environment_var(var_name, default, prefixed=True):

ASSESS_ANSWER_SERVICE_URL = get_environment_var(
'ASSESS_ANSWER_SERVICE_URL', 'https://aas.sepid.org/')

SHAD_LOGIN_USERNAME = get_environment_var('SHAD_LOGIN_USERNAME', None)
SHAD_LOGIN_PASSWORD = get_environment_var('SHAD_LOGIN_PASSWORD', None)
33 changes: 33 additions & 0 deletions proxies/Shad.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
from django.conf import settings

from proxies.http_request_utils import post

SHAD_LOGIN_USERNAME = settings.SHAD_LOGIN_USERNAME
SHAD_LOGIN_PASSWORD = settings.SHAD_LOGIN_PASSWORD


SHAD_API_URL = 'https://shadapi.noyanet.com/api/v1'


def login_to_Shad(landing_id=284):

url = f'{SHAD_API_URL}/account/login/'

payload = {
"landingId": landing_id,
"username": SHAD_LOGIN_USERNAME,
"password": SHAD_LOGIN_PASSWORD,
}

return post(url, payload)


def get_user_data(token, user_uuid):
url = f'{SHAD_API_URL}/ShadEvent?UserHashId={user_uuid}'

headers = {
"Authorization": f"Bearer {token}"
}

payload = {}
return post(url, payload, headers=headers)
72 changes: 4 additions & 68 deletions proxies/bank_service/bank.py
Original file line number Diff line number Diff line change
@@ -1,72 +1,8 @@
from django.conf import settings
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
from rest_framework import status
from rest_framework.response import Response

BANK_URL = settings.BANK_URL


# Configure retry strategy
def get_retry_session(retries=5, backoff_factor=0.3,
status_forcelist=(500, 502, 503, 504)):
"""
Create a requests session with retry capabilities.
from proxies.http_request_utils import get, post

Args:
retries (int): Number of total retries to allow.
backoff_factor (float): A backoff factor to apply between attempts.
status_forcelist (tuple): HTTP status codes to retry on.
Returns:
requests.Session: A configured session with retry capabilities
"""
retry_strategy = Retry(
total=retries,
status_forcelist=status_forcelist,
allowed_methods=["GET", "POST"], # Only retry these methods
backoff_factor=backoff_factor
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session = requests.Session()
session.mount("http://", adapter)
session.mount("https://", adapter)
return session


def _get(url, params):
try:
session = get_retry_session()
response = session.get(
url,
params=params,
timeout=10
)
response.raise_for_status()
return response.json()
except requests.RequestException as e:
return Response(
{"error": f"Failed to process GET request after retries: {str(e)}"},
status=status.HTTP_500_INTERNAL_SERVER_ERROR
)


def _post(url, payload):
try:
session = get_retry_session()
response = session.post(
url,
json=payload,
timeout=10
)
response.raise_for_status()
return response.json()
except requests.RequestException as e:
return Response(
{"error": f"Failed to process POST request after retries: {str(e)}"},
status=status.HTTP_500_INTERNAL_SERVER_ERROR
)
BANK_URL = settings.BANK_URL


def request_transfer(sender_id: str, receiver_id: str, funds: dict):
Expand All @@ -89,7 +25,7 @@ def request_transfer(sender_id: str, receiver_id: str, funds: dict):
"funds": funds
}

return _post(url, payload)
return post(url, payload)


def get_user_balances(user_uuid):
Expand All @@ -100,4 +36,4 @@ def get_user_balances(user_uuid):
"user_uuid": user_uuid,
}

return _get(url, payload)
return get(url, payload)
67 changes: 67 additions & 0 deletions proxies/http_request_utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
from rest_framework import status
from rest_framework.response import Response


# Configure retry strategy
def get_retry_session(retries=5, backoff_factor=0.3,
status_forcelist=(500, 502, 503, 504)):
"""
Create a requests session with retry capabilities.
Args:
retries (int): Number of total retries to allow.
backoff_factor (float): A backoff factor to apply between attempts.
status_forcelist (tuple): HTTP status codes to retry on.
Returns:
requests.Session: A configured session with retry capabilities
"""
retry_strategy = Retry(
total=retries,
status_forcelist=status_forcelist,
allowed_methods=["GET", "POST"], # Only retry these methods
backoff_factor=backoff_factor
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session = requests.Session()
session.mount("http://", adapter)
session.mount("https://", adapter)
return session


def get(url, params):
try:
session = get_retry_session()
response = session.get(
url,
params=params,
timeout=10
)
response.raise_for_status()
return response.json()
except requests.RequestException as e:
return Response(
{"error": f"Failed to process GET request after retries: {str(e)}"},
status=status.HTTP_500_INTERNAL_SERVER_ERROR
)


def post(url, payload, headers=None):
try:
session = get_retry_session()
response = session.post(
url,
json=payload,
headers=headers,
timeout=10
)
response.raise_for_status()
return response.json()
except requests.RequestException as e:
return Response(
{"error": f"Failed to process POST request after retries: {str(e)}"},
status=status.HTTP_500_INTERNAL_SERVER_ERROR
)

0 comments on commit 2ac062d

Please sign in to comment.