如何定期更新对象配置?

2024-06-07 06:13:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在给我们的客户关系管理系统写一个连接器。CRM有自己的配置,我想知道。CRM是这些配置的唯一信任来源,并通过API提供这些配置。现在我在python包中有了作为python类的连接器。CRM配置在init上更新,但一旦可以从CRM中更改,我希望定期更新。有没有什么好方法可以在创建对象实例时创建某种任务来执行配置更新

class Crm:
    def __init__(self, crm_config, mongo_connection_string):
        self.update_crm_configuration()

    def update_crm_configuration(self):
        self.crm_configuration = self.get_crm_configuration_from_crm_api()

    def get_crm_configuration_from_crm_api(self):
        r = self._send_crm_request_wrap(send_request_func=self._send_get_crm_configuration)
        return self._parse_crm_configuration_response(r.text)

现在我只更新一次配置,但我需要定期更新它们


Tags: fromselfsendapigetinitrequestdef
1条回答
网友
1楼 · 发布于 2024-06-07 06:13:35

最好的方法似乎不是使用不同的线程或任务进行定期更新,而是保存上次更新配置的时间,如果此时存在超时,则在实际执行请求之前更新配置

或者,如果您的API拥有“配置已更改”的良好异常,那么在请求重试之前对响应处理程序执行配置更新就更好了

我正在使用一个请求包装器来实现这些目的

    def _send_crm_request_wrap(self, send_request_func, func_params=(),
                               check_crm_configuration=True,
                               retries_limit=None):
        if check_crm_configuration \
                and time.time() - self.last_update_crm_configuration_time > CRM_CONFIGURATION_TIMEOUT:
            self.update_crm_configuration()

        while self.is_crm_locked():
            time.sleep(1000)

        if not self.is_authorized():
            self.auth()

        r = send_request_func(*func_params)
        if retries_limit is None:
            retries_limit = self.max_retries
        retry = 1
        while r.status_code == 205 and retry <= retries_limit:
            waiting_time = randint(1000, 2000)
            logging.info(f'Retry {retry} for {send_request_func.__name__}. Waiting for {waiting_time} sec')
            time.sleep(waiting_time)
            r = send_request_func(*func_params)
            retry += 1

        if r.status_code not in [200]:
            message = f'AMO CRM {send_request_func.__name__} with args={func_params} failed. ' \
                      f'Error: {r.status_code} {r.text}'
            logging.error(message)
            raise ConnectionError(message)

        return r

相关问题 更多 >