Defer patching requests default agent when it is imported

Importing requests module in `trytond/__init__.py` prevents the gevent monkey
patch to be applied to the requests module as it is imported before.

Closes #14461
This commit is contained in:
Cédric Krier committed 2026-01-03 13:45:10 +01:00
1 parent 6ef9085289
commit 40ce993a5b
1 file changed
+27 -13
+27 -13
View File
@@ -2,7 +2,9 @@
# this repository contains the full copyright notices and license terms.
import decimal
import importlib
import os
import sys
import time
import warnings
from email import charset
@@ -10,11 +12,6 @@ from email import charset
import __main__
from lxml import etree, objectify
try:
from requests import utils as requests_utils
except ImportError:
requests_utils = None
__version__ = "7.9.0"
__series__ = '.'.join(__version__.split('.')[:2])
@@ -37,12 +34,29 @@ charset.add_charset('utf-8', charset.QP, charset.QP)
etree.set_default_parser(etree.XMLParser(resolve_entities=False))
objectify.set_default_parser(objectify.makeparser(resolve_entities=False))
def default_user_agent(name="Tryton"):
return f"{name}/{__version__}"
if requests_utils:
requests_utils.default_user_agent = default_user_agent
decimal.DefaultContext.prec = int(os.environ.get('TRYTOND_DECIMAL_PREC', 28))
class _RequestPatchFinder:
def find_spec(self, fullname, path, target=None):
if fullname != 'requests.utils':
return
sys.meta_path.remove(self)
spec = importlib.util.find_spec(fullname)
loader = spec.loader
original_exec = loader.exec_module
def exec_module(module):
original_exec(module)
self._patch_requests_utils(module)
loader.exec_module = exec_module
return spec
@staticmethod
def _patch_requests_utils(module):
def default_user_agent(name="Tryton"):
return f"{name}/{__version__}"
module.default_user_agent = default_user_agent
sys.meta_path.insert(0, _RequestPatchFinder())