py.lib.aw_web_tools

Yohn Y. 2025-10-15 Parent:06f00ec09030

14:0920ae304dfd Go to Latest

py.lib.aw_web_tools/src/aw_web_tools/cookie.py

.. 1.202510.1 + Режим фековой авторизации для адаптера authelia. Режим требуется для отладки, поскольку вряд ли на машине разработчика будет развёрнуто это ПО на ранних стадиях разработки (преальфа). Возможно режим будет полезен при поиска проблем в приложении при авторизации.

History
awgur@0 1 # coding: utf-8
awgur@0 2
awgur@0 3 import bottle
awgur@0 4 from typing import Union, Any, Dict, Optional
awgur@0 5 from datetime import datetime
awgur@0 6
awgur@0 7
awgur@0 8 class Cookie(object):
awgur@0 9 """\
awgur@0 10 Класс хранящий ``cookie`` и способный их устанавливать в объекты http-ответов ``bottle``
awgur@0 11 """
awgur@0 12
awgur@0 13 def __init__(self, name: str, value: str,
awgur@0 14 max_age: Optional[int] = None,
awgur@0 15 expires: Optional[Union[int, datetime]] = None,
awgur@0 16 path: Optional[str] = None,
awgur@0 17 secure: bool = True,
awgur@0 18 httponly: bool = True,
awgur@0 19 samesite: bool = False,
awgur@0 20 domain: Optional[str] = None):
awgur@0 21 """\
awgur@0 22 :param name: Имя ``cookie``
awgur@0 23 :param value: Значение ``cookie``
awgur@0 24 :param max_age: Время жизни ``cookie`` в секундах.
awgur@0 25 :param expires: Значение времени, когда cookie будет удалена, задаётся в виде ``unix timestamp (int)`` или
awgur@0 26 ``datetime``
awgur@0 27 :param path: Префикс пути поиска ресурса на данном сайте, для которого следует отправлять данное ``cookie``
awgur@0 28 :param secure: Отправлять ``cookie`` только по шифрованным каналам связи
awgur@0 29 :param httponly: Сделать ``cookie`` не доступной для ``JavaScript``
awgur@0 30 :param samesite: Не отправлять данную cookie, если запрос пришёл не с того же сайта (анализируется заголовок
awgur@0 31 referer)
awgur@0 32 :param domain: Имя домена в рамках которого выставляется cookie. В современных браузерах может и глючить
awgur@0 33 """
awgur@0 34
awgur@0 35 self.name = name
awgur@0 36 self.value = value
awgur@0 37 self.max_age = max_age
awgur@0 38 self.expires = expires
awgur@0 39 self.path = path
awgur@0 40 self.secure = secure
awgur@0 41 self.httponly = httponly
awgur@0 42 self.samesite = samesite
awgur@0 43 self.domain = domain
awgur@0 44
awgur@0 45 def to_dict(self) -> Dict[str, Any]:
awgur@0 46 """\
awgur@0 47 Подготавливает параметры, которые можно передать в процедуру ``set_cookie``
awgur@0 48 объекта ``Response``
awgur@0 49 """
awgur@0 50 res = {
awgur@0 51 'name': self.name,
awgur@0 52 'value': self.value,
awgur@0 53 'secure': self.secure,
awgur@0 54 'httponly': self.httponly,
awgur@0 55 }
awgur@0 56
awgur@0 57 if self.samesite:
awgur@0 58 res['samesite'] = 'strict'
awgur@0 59
awgur@0 60 for k in ('max_age', 'expires', 'path', 'domain'):
awgur@0 61 if getattr(self, k) is not None:
awgur@0 62 res[k] = getattr(self, k)
awgur@0 63
awgur@0 64 return res
awgur@0 65
awgur@0 66 def get_remove_param(self) -> Dict[str, Any]:
awgur@0 67 """\
awgur@0 68 Подготавливает параметры, которые можно передать в процедуру ``delete_cookie``
awgur@0 69 объекта ``Response``
awgur@0 70 """
awgur@0 71 res = self.to_dict()
awgur@0 72 res['key'] = res['name']
awgur@0 73 del res['value']
awgur@0 74 del res['name']
awgur@0 75 return res
awgur@0 76
awgur@0 77 def response_add(self, resp: bottle.BaseResponse):
awgur@0 78 resp.set_cookie(**self.to_dict())
awgur@0 79
awgur@0 80 def response_delete(self, resp: bottle.BaseResponse):
awgur@0 81 resp.delete_cookie(**self.get_remove_param())