py.lib.aw_web_tools

Yohn Y. 2024-02-27 Parent:06f00ec09030

3:2d0e1f161f26 Go to Latest

py.lib.aw_web_tools/src/aw_web_tools/btle_tools.py

+ Возможность указать непосредственный объект запроса для инструментальных функций

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