py.lib.aw_web_tools

Yohn Y. 2024-02-25

0:06f00ec09030 Go to Latest

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

..init

History
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/aw_web_tools/cookie.py	Sun Feb 25 15:18:36 2024 +0300
     1.3 @@ -0,0 +1,81 @@
     1.4 +# coding: utf-8
     1.5 +
     1.6 +import bottle
     1.7 +from typing import Union, Any, Dict, Optional
     1.8 +from datetime import datetime
     1.9 +
    1.10 +
    1.11 +class Cookie(object):
    1.12 +    """\
    1.13 +    Класс хранящий ``cookie`` и способный их устанавливать в объекты http-ответов ``bottle``
    1.14 +    """
    1.15 +
    1.16 +    def __init__(self, name: str, value: str,
    1.17 +                 max_age: Optional[int] = None,
    1.18 +                 expires: Optional[Union[int, datetime]] = None,
    1.19 +                 path: Optional[str] = None,
    1.20 +                 secure: bool = True,
    1.21 +                 httponly: bool = True,
    1.22 +                 samesite: bool = False,
    1.23 +                 domain: Optional[str] = None):
    1.24 +        """\
    1.25 +        :param name: Имя ``cookie``
    1.26 +        :param value: Значение ``cookie``
    1.27 +        :param max_age: Время жизни ``cookie`` в секундах.
    1.28 +        :param expires: Значение времени, когда cookie будет удалена, задаётся в виде ``unix timestamp (int)`` или
    1.29 +                        ``datetime``
    1.30 +        :param path: Префикс пути поиска ресурса на данном сайте, для которого следует отправлять данное ``cookie``
    1.31 +        :param secure: Отправлять ``cookie`` только по шифрованным каналам связи
    1.32 +        :param httponly: Сделать ``cookie`` не доступной для ``JavaScript``
    1.33 +        :param samesite: Не отправлять данную cookie, если запрос пришёл не с того же сайта (анализируется заголовок
    1.34 +                         referer)
    1.35 +        :param domain: Имя домена в рамках которого выставляется cookie. В современных браузерах может и глючить
    1.36 +        """
    1.37 +
    1.38 +        self.name = name
    1.39 +        self.value = value
    1.40 +        self.max_age = max_age
    1.41 +        self.expires = expires
    1.42 +        self.path = path
    1.43 +        self.secure = secure
    1.44 +        self.httponly = httponly
    1.45 +        self.samesite = samesite
    1.46 +        self.domain = domain
    1.47 +
    1.48 +    def to_dict(self) -> Dict[str, Any]:
    1.49 +        """\
    1.50 +        Подготавливает параметры, которые можно передать в процедуру ``set_cookie``
    1.51 +        объекта ``Response``
    1.52 +        """
    1.53 +        res = {
    1.54 +            'name': self.name,
    1.55 +            'value': self.value,
    1.56 +            'secure': self.secure,
    1.57 +            'httponly': self.httponly,
    1.58 +        }
    1.59 +
    1.60 +        if self.samesite:
    1.61 +            res['samesite'] = 'strict'
    1.62 +
    1.63 +        for k in ('max_age', 'expires', 'path', 'domain'):
    1.64 +            if getattr(self, k) is not None:
    1.65 +                res[k] = getattr(self, k)
    1.66 +
    1.67 +        return res
    1.68 +
    1.69 +    def get_remove_param(self) -> Dict[str, Any]:
    1.70 +        """\
    1.71 +        Подготавливает параметры, которые можно передать в процедуру ``delete_cookie``
    1.72 +        объекта ``Response``
    1.73 +        """
    1.74 +        res = self.to_dict()
    1.75 +        res['key'] = res['name']
    1.76 +        del res['value']
    1.77 +        del res['name']
    1.78 +        return res
    1.79 +
    1.80 +    def response_add(self, resp: bottle.BaseResponse):
    1.81 +        resp.set_cookie(**self.to_dict())
    1.82 +
    1.83 +    def response_delete(self, resp: bottle.BaseResponse):
    1.84 +        resp.delete_cookie(**self.get_remove_param())