From fac3aff2c4a2ac2ad338de083693cf898a9f1d71 Mon Sep 17 00:00:00 2001 From: helllllllder Date: Fri, 11 Oct 2024 09:56:09 -0300 Subject: [PATCH] feat: add requests module on core app, add get_request_session_with_retries function to msg callback --- chats/apps/msgs/models.py | 13 +++++++++---- chats/core/requests.py | 27 +++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 chats/core/requests.py diff --git a/chats/apps/msgs/models.py b/chats/apps/msgs/models.py index 7a6eeb69..2f037733 100644 --- a/chats/apps/msgs/models.py +++ b/chats/apps/msgs/models.py @@ -1,6 +1,5 @@ import json -import requests from django.conf import settings from django.core.serializers.json import DjangoJSONEncoder from django.db import models @@ -8,6 +7,7 @@ from rest_framework.exceptions import ValidationError from chats.core.models import BaseModel +from chats.core.requests import get_request_session_with_retries class Message(BaseModel): @@ -86,8 +86,10 @@ def notify_room(self, action: str, callback: bool = False): self.room.base_notification(content=data, action=f"msg.{action}") if self.room.callback_url and callback: data = self.update_msg_text_with_signature(data) - - requests.post( + request_session = get_request_session_with_retries( + status_forcelist=[429, 500, 502, 503, 504], method_whitelist=["POST"] + ) + request_session.post( self.room.callback_url, data=json.dumps( {"type": "msg.create", "content": data}, @@ -147,7 +149,10 @@ def callback(self): msg_data["text"] = "" if self.message.room.callback_url: - requests.post( + request_session = get_request_session_with_retries( + status_forcelist=[429, 500, 502, 503, 504], method_whitelist=["POST"] + ) + request_session.post( self.message.room.callback_url, data=json.dumps( {"type": "msg.create", "content": msg_data}, diff --git a/chats/core/requests.py b/chats/core/requests.py new file mode 100644 index 00000000..a8dea2d4 --- /dev/null +++ b/chats/core/requests.py @@ -0,0 +1,27 @@ +from numbers import Number + +import requests +from requests.adapters import HTTPAdapter +from urllib3.util.retry import Retry + + +def get_request_session_with_retries( + retries: int = 5, + backoff_factor: Number = 0.1, + status_forcelist: list = [], + method_whitelist: list = [], +) -> requests.Session: + retry_strategy = Retry( + total=retries, + backoff_factor=backoff_factor, + status_forcelist=status_forcelist, + method_whitelist=method_whitelist, + ) + + adapter = HTTPAdapter(max_retries=retry_strategy) + + session = requests.Session() + session.mount("https://", adapter) + session.mount("http://", adapter) + + return session