py.lib.aw_web_tools

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

5:4d3b509e0967 Go to Latest

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

+ Реализация плагина идентификации . Сводим все классы исключений к одному предку для удобства

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())