py.lib.aw_web_tools
2024-02-27
Parent:06f00ec09030
py.lib.aw_web_tools/src/aw_web_tools/btle_tools.py
+ Возможность указать непосредственный объект запроса для инструментальных функций
1.1 --- a/src/aw_web_tools/btle_tools.py Tue Feb 27 13:20:38 2024 +0300 1.2 +++ b/src/aw_web_tools/btle_tools.py Tue Feb 27 13:20:50 2024 +0300 1.3 @@ -21,26 +21,28 @@ 1.4 CONN_ID_HEADER = 'X-Conn-ID' # Идентификатор текущего соединения. 1.5 1.6 1.7 -def get_client_ip() -> str: 1.8 +def get_client_ip(request: bottle.BaseRequest = bottle.request) -> str: 1.9 """\ 1.10 Получение реального адреса клиента 1.11 """ 1.12 - ip = bottle.request.get_header(IP_HEADER) 1.13 + ip = request.get_header(IP_HEADER) 1.14 if ip: 1.15 return ip 1.16 1.17 else: 1.18 - return bottle.request.remote_addr 1.19 + return request.remote_addr 1.20 1.21 1.22 -def get_session_fingerprint(*add_params) -> str: 1.23 +def get_session_fingerprint(*add_params, request: bottle.BaseRequest = bottle.request) -> str: 1.24 """\ 1.25 Конструируем некий отпечаток пользовательской сессии. 1.26 1.27 В качестве параметра принимается всё, что должно участвовать в создании отпечатка. 1.28 Это всё превращается в строки и подмешивается в хэш 1.29 + 1.30 + При необходимости задать объект запроса, следует использовать форму ``request=<REQOBJ>`` 1.31 """ 1.32 - ua = bottle.request.get_header('user-agent') 1.33 + ua = request.get_header('user-agent') 1.34 add_params_mixin = ':'.join(map(str, add_params)) 1.35 1.36 return sha512(f'{ua}:{get_client_ip()}:{add_params_mixin}'.encode('utf-8')).hexdigest().lower() 1.37 @@ -75,23 +77,23 @@ 1.38 return res 1.39 1.40 1.41 -def get_env(name: str, default=None): 1.42 +def get_env(name: str, default: Any = None, request: bottle.BaseRequest = bottle.request): 1.43 """\ 1.44 Возвращает значения из хранилища контекста запроса bottle 1.45 """ 1.46 _name = f'{VARIABLE_PREFIX}.{name}' 1.47 - if _name in bottle.request.environ: 1.48 - return bottle.request.environ[_name] 1.49 + if _name in request.environ: 1.50 + return request.environ[_name] 1.51 1.52 else: 1.53 return default 1.54 1.55 1.56 -def set_env(name: str, value): 1.57 +def set_env(name: str, value: Any, request: bottle.BaseRequest = bottle.request): 1.58 """\ 1.59 Устанавливает значения в хранилище контекста запроса bottle 1.60 """ 1.61 - bottle.request.environ[f'{VARIABLE_PREFIX}.{name}'] = value 1.62 + request.environ[f'{VARIABLE_PREFIX}.{name}'] = value 1.63 1.64 1.65 def json_type_sanitizer(val): 1.66 @@ -155,15 +157,18 @@ 1.67 return res 1.68 1.69 1.70 -def get_cookie(name: str) -> Optional[str]: 1.71 +def get_cookie(name: str, request: bottle.BaseRequest = bottle.request) -> Optional[str]: 1.72 """\ 1.73 Получить значение ``cookie`` с заданным именем из текущего запроса. 1.74 """ 1.75 - return bottle.request.get_cookie(name) 1.76 + return request.get_cookie(name) 1.77 1.78 1.79 def get_param(name: str, param_type: Union[type, str] = str, 1.80 - default=None, postprocess: bool = True, param_source: str = None): 1.81 + default=None, postprocess: bool = True, 1.82 + param_source: str = None, 1.83 + request: bottle.BaseRequest = bottle.request 1.84 + ): 1.85 """\ 1.86 Получить из обрабатываемого на данный момент запроса значения установленного параметра. Обрабатываются как 1.87 ``GET``, так и ``POST`` параметры, если иное не указано конкретно. 1.88 @@ -173,14 +178,15 @@ 1.89 :param default: Значение, отдаваемое, если параметр не установлен в запросе 1.90 :param postprocess: Производить ли постобработку параметра 1.91 :param param_source: Источник параметра, [``get``, ``post``] 1.92 + :param request: Объект обрабатываемого запроса. По умолчанию - ``bottle.request`` 1.93 :returns Полученное из запроса значение 1.94 """ 1.95 if param_source is None: 1.96 - res = bottle.request.params.getunicode(name) 1.97 + res = request.params.getunicode(name) 1.98 elif param_source.lower() == 'get': 1.99 - res = bottle.request.GET.getunicode(name) 1.100 + res = request.GET.getunicode(name) 1.101 elif param_source.lower() == 'post': 1.102 - res = bottle.request.POST.getunicode(name) 1.103 + res = request.POST.getunicode(name) 1.104 else: 1.105 raise ValueError(f'Unknown parameter source "{param_source}" for "{name}"') 1.106 1.107 @@ -206,16 +212,20 @@ 1.108 raise ValueError(f'Error parsing parameter "{name}": {e}') 1.109 1.110 1.111 -def make_log_topic(user: Optional[str] = None) -> str: 1.112 +def make_log_topic( 1.113 + user: Optional[str] = None, 1.114 + request: bottle.BaseRequest = bottle.request 1.115 + ) -> str: 1.116 """\ 1.117 Создаём строку, идентифицирующую данный запрос для журналирования операций. 1.118 1.119 :param user: Если известен пользователь, задаём его здесь 1.120 + :param request: Объект обрабатываемого запроса. По умолчанию - ``bottle.request`` 1.121 """ 1.122 ip = get_client_ip() 1.123 - url_path = bottle.request.fullpath 1.124 - conn_id = bottle.request.get_header(CONN_ID_HEADER) 1.125 - req_id = bottle.request.get_header(REQ_ID_HEADER) 1.126 + url_path = request.fullpath 1.127 + conn_id = request.get_header(CONN_ID_HEADER) 1.128 + req_id = request.get_header(REQ_ID_HEADER) 1.129 1.130 if req_id is not None: 1.131 ip = f'{ip} | {req_id}'