details: https://code.tryton.org/tryton/commit/31aef35415b6
branch: 7.8
user: Cédric Krier <[email protected]>
date: Sat Jan 03 13:45:10 2026 +0100
description:
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
(grafted from f46f8037da40d5208b4d32552529d7dbca1dedea)
diffstat:
trytond/trytond/__init__.py | 36 +++++++++++++++++++++++++-----------
1 files changed, 25 insertions(+), 11 deletions(-)
diffs (61 lines):
diff -r d4545f4a786f -r 31aef35415b6 trytond/trytond/__init__.py
--- a/trytond/trytond/__init__.py Fri Jan 09 11:29:24 2026 +0100
+++ b/trytond/trytond/__init__.py Sat Jan 03 13:45:10 2026 +0100
@@ -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 @@
import __main__
from lxml import etree, objectify
-try:
- from requests import utils as requests_utils
-except ImportError:
- requests_utils = None
-
__version__ = "7.8.2"
__series__ = '.'.join(__version__.split('.')[:2])
@@ -37,12 +34,29 @@
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__}"
+decimal.DefaultContext.prec = int(os.environ.get('TRYTOND_DECIMAL_PREC', 28))
-if requests_utils:
- requests_utils.default_user_agent = default_user_agent
+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
-decimal.DefaultContext.prec = int(os.environ.get('TRYTOND_DECIMAL_PREC', 28))
+ 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())