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