py.lib.aw_web_tools
2025-10-15
Parent:06f00ec09030
py.lib.aw_web_tools/src/aw_web_tools/cookie.py
.. 1.202510.1 + Режим фековой авторизации для адаптера authelia. Режим требуется для отладки, поскольку вряд ли на машине разработчика будет развёрнуто это ПО на ранних стадиях разработки (преальфа). Возможно режим будет полезен при поиска проблем в приложении при авторизации.
| 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()) |