py.lib.aw_web_tools
2024-02-25
py.lib.aw_web_tools/src/aw_web_tools/cookie.py
..init
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())