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