py.lib.aw_web_tools

Yohn Y. 2024-02-27 Parent:774c6728b7ff Child:d20943f0eadf

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}'