py.lib.aw_web_tools
3:2d0e1f161f26 0.202402.2 Browse Files
+ Возможность указать непосредственный объект запроса для инструментальных функций
pyproject.toml setup.py src/aw_web_tools/btle_tools.py
1.1 --- a/pyproject.toml Tue Feb 27 13:20:38 2024 +0300 1.2 +++ b/pyproject.toml Tue Feb 27 13:20:50 2024 +0300 1.3 @@ -7,7 +7,7 @@ 1.4 1.5 [project] 1.6 name = "aw_web_tools" 1.7 -version = "0.202402.1" 1.8 +version = "0.202402.2" 1.9 requires-python = ">=3.8" 1.10 dependencies = [ 1.11 "PyJWT>=2.8.0",
2.1 --- a/setup.py Tue Feb 27 13:20:38 2024 +0300 2.2 +++ b/setup.py Tue Feb 27 13:20:50 2024 +0300 2.3 @@ -2,7 +2,7 @@ 2.4 2.5 setup( 2.6 name='aw_web_tools', 2.7 - version='0.202402.1', 2.8 + version='0.202402.2', 2.9 packages=['aw_web_tools'], 2.10 package_dir={'aw_web_tools': 'src/aw_web_tools'}, 2.11 url='https://devel.a0fs.ru/py.lib.aw_web_tools/',
3.1 --- a/src/aw_web_tools/btle_tools.py Tue Feb 27 13:20:38 2024 +0300 3.2 +++ b/src/aw_web_tools/btle_tools.py Tue Feb 27 13:20:50 2024 +0300 3.3 @@ -21,26 +21,28 @@ 3.4 CONN_ID_HEADER = 'X-Conn-ID' # Идентификатор текущего соединения. 3.5 3.6 3.7 -def get_client_ip() -> str: 3.8 +def get_client_ip(request: bottle.BaseRequest = bottle.request) -> str: 3.9 """\ 3.10 Получение реального адреса клиента 3.11 """ 3.12 - ip = bottle.request.get_header(IP_HEADER) 3.13 + ip = request.get_header(IP_HEADER) 3.14 if ip: 3.15 return ip 3.16 3.17 else: 3.18 - return bottle.request.remote_addr 3.19 + return request.remote_addr 3.20 3.21 3.22 -def get_session_fingerprint(*add_params) -> str: 3.23 +def get_session_fingerprint(*add_params, request: bottle.BaseRequest = bottle.request) -> str: 3.24 """\ 3.25 Конструируем некий отпечаток пользовательской сессии. 3.26 3.27 В качестве параметра принимается всё, что должно участвовать в создании отпечатка. 3.28 Это всё превращается в строки и подмешивается в хэш 3.29 + 3.30 + При необходимости задать объект запроса, следует использовать форму ``request=<REQOBJ>`` 3.31 """ 3.32 - ua = bottle.request.get_header('user-agent') 3.33 + ua = request.get_header('user-agent') 3.34 add_params_mixin = ':'.join(map(str, add_params)) 3.35 3.36 return sha512(f'{ua}:{get_client_ip()}:{add_params_mixin}'.encode('utf-8')).hexdigest().lower() 3.37 @@ -75,23 +77,23 @@ 3.38 return res 3.39 3.40 3.41 -def get_env(name: str, default=None): 3.42 +def get_env(name: str, default: Any = None, request: bottle.BaseRequest = bottle.request): 3.43 """\ 3.44 Возвращает значения из хранилища контекста запроса bottle 3.45 """ 3.46 _name = f'{VARIABLE_PREFIX}.{name}' 3.47 - if _name in bottle.request.environ: 3.48 - return bottle.request.environ[_name] 3.49 + if _name in request.environ: 3.50 + return request.environ[_name] 3.51 3.52 else: 3.53 return default 3.54 3.55 3.56 -def set_env(name: str, value): 3.57 +def set_env(name: str, value: Any, request: bottle.BaseRequest = bottle.request): 3.58 """\ 3.59 Устанавливает значения в хранилище контекста запроса bottle 3.60 """ 3.61 - bottle.request.environ[f'{VARIABLE_PREFIX}.{name}'] = value 3.62 + request.environ[f'{VARIABLE_PREFIX}.{name}'] = value 3.63 3.64 3.65 def json_type_sanitizer(val): 3.66 @@ -155,15 +157,18 @@ 3.67 return res 3.68 3.69 3.70 -def get_cookie(name: str) -> Optional[str]: 3.71 +def get_cookie(name: str, request: bottle.BaseRequest = bottle.request) -> Optional[str]: 3.72 """\ 3.73 Получить значение ``cookie`` с заданным именем из текущего запроса. 3.74 """ 3.75 - return bottle.request.get_cookie(name) 3.76 + return request.get_cookie(name) 3.77 3.78 3.79 def get_param(name: str, param_type: Union[type, str] = str, 3.80 - default=None, postprocess: bool = True, param_source: str = None): 3.81 + default=None, postprocess: bool = True, 3.82 + param_source: str = None, 3.83 + request: bottle.BaseRequest = bottle.request 3.84 + ): 3.85 """\ 3.86 Получить из обрабатываемого на данный момент запроса значения установленного параметра. Обрабатываются как 3.87 ``GET``, так и ``POST`` параметры, если иное не указано конкретно. 3.88 @@ -173,14 +178,15 @@ 3.89 :param default: Значение, отдаваемое, если параметр не установлен в запросе 3.90 :param postprocess: Производить ли постобработку параметра 3.91 :param param_source: Источник параметра, [``get``, ``post``] 3.92 + :param request: Объект обрабатываемого запроса. По умолчанию - ``bottle.request`` 3.93 :returns Полученное из запроса значение 3.94 """ 3.95 if param_source is None: 3.96 - res = bottle.request.params.getunicode(name) 3.97 + res = request.params.getunicode(name) 3.98 elif param_source.lower() == 'get': 3.99 - res = bottle.request.GET.getunicode(name) 3.100 + res = request.GET.getunicode(name) 3.101 elif param_source.lower() == 'post': 3.102 - res = bottle.request.POST.getunicode(name) 3.103 + res = request.POST.getunicode(name) 3.104 else: 3.105 raise ValueError(f'Unknown parameter source "{param_source}" for "{name}"') 3.106 3.107 @@ -206,16 +212,20 @@ 3.108 raise ValueError(f'Error parsing parameter "{name}": {e}') 3.109 3.110 3.111 -def make_log_topic(user: Optional[str] = None) -> str: 3.112 +def make_log_topic( 3.113 + user: Optional[str] = None, 3.114 + request: bottle.BaseRequest = bottle.request 3.115 + ) -> str: 3.116 """\ 3.117 Создаём строку, идентифицирующую данный запрос для журналирования операций. 3.118 3.119 :param user: Если известен пользователь, задаём его здесь 3.120 + :param request: Объект обрабатываемого запроса. По умолчанию - ``bottle.request`` 3.121 """ 3.122 ip = get_client_ip() 3.123 - url_path = bottle.request.fullpath 3.124 - conn_id = bottle.request.get_header(CONN_ID_HEADER) 3.125 - req_id = bottle.request.get_header(REQ_ID_HEADER) 3.126 + url_path = request.fullpath 3.127 + conn_id = request.get_header(CONN_ID_HEADER) 3.128 + req_id = request.get_header(REQ_ID_HEADER) 3.129 3.130 if req_id is not None: 3.131 ip = f'{ip} | {req_id}'