py.lib

Yohn Y. 2022-08-27 Parent:483727ff89c4 Child:6f8bea109183

42:d9a3784f681b Browse Files

+ Возможность удаления cookie по полному объекту (полезно, когда выставляются особые параметры на cookie, и их не удаётся удалить по имени)

webapp/bottle_urils.py

     1.1 --- a/webapp/bottle_urils.py	Sat Aug 27 11:22:06 2022 +0300
     1.2 +++ b/webapp/bottle_urils.py	Sat Aug 27 17:56:21 2022 +0300
     1.3 @@ -5,7 +5,7 @@
     1.4  
     1.5  import bottle
     1.6  import json
     1.7 -from typing import Union, List, Optional, Tuple, Any
     1.8 +from typing import Union, List, Optional, Tuple, Any, Dict
     1.9  from datetime import datetime
    1.10  from hashlib import sha512
    1.11  from dataclasses import is_dataclass, asdict
    1.12 @@ -52,7 +52,11 @@
    1.13          self.samesite = samesite
    1.14          self.domain = domain
    1.15  
    1.16 -    def response_add(self, resp: bottle.BaseResponse):
    1.17 +    def get_add_params(self) -> Dict[str, Any]:
    1.18 +        """\
    1.19 +        Подготавливает параметры, которые можно передать в процедуру ``set_cookie``
    1.20 +        объекта ``Response``
    1.21 +        """
    1.22          res = {
    1.23              'name': self.name,
    1.24              'value': self.value,
    1.25 @@ -67,7 +71,24 @@
    1.26              if getattr(self, k) is not None:
    1.27                  res[k] = getattr(self, k)
    1.28  
    1.29 -        resp.set_cookie(**res)
    1.30 +        return res
    1.31 +
    1.32 +    def get_remove_param(self) -> Dict[str, Any]:
    1.33 +        """\
    1.34 +        Подготавливает параметры, которые можно передать в процедуру ``delete_cookie``
    1.35 +        объекта ``Response``
    1.36 +        """
    1.37 +        res = self.get_add_params()
    1.38 +        res['key'] = res['name']
    1.39 +        del res['value']
    1.40 +        del res['name']
    1.41 +        return res
    1.42 +
    1.43 +    def response_add(self, resp: bottle.BaseResponse):
    1.44 +        resp.set_cookie(**self.get_add_params())
    1.45 +
    1.46 +    def response_delete(self, resp: bottle.BaseResponse):
    1.47 +        resp.delete_cookie(**self.get_remove_param())
    1.48  
    1.49  
    1.50  def get_client_ip() -> str:
    1.51 @@ -150,7 +171,7 @@
    1.52  
    1.53  def make_response(
    1.54          data=None, status=200, cookies: Optional[List[Cookie]] = None,
    1.55 -        remove_cookies: Optional[List[str]] = None
    1.56 +        remove_cookies: Optional[List[Union[str, Cookie]]] = None
    1.57  ) -> bottle.HTTPResponse:
    1.58      """\
    1.59      Формирует ``API`` ответ.
    1.60 @@ -168,7 +189,11 @@
    1.61  
    1.62      if remove_cookies is not None and remove_cookies:
    1.63          for cookie in remove_cookies:
    1.64 -            res.delete_cookie(cookie)
    1.65 +            if isinstance(cookie, Cookie):
    1.66 +                cookie.response_delete(res)
    1.67 +
    1.68 +            else:
    1.69 +                res.delete_cookie(cookie)
    1.70  
    1.71      return res
    1.72  
    1.73 @@ -283,7 +308,7 @@
    1.74      if conn_id is not None:
    1.75          ip = f'{ip} | {conn_id}'
    1.76  
    1.77 -    if user is not None:
    1.78 +    if user is None:
    1.79          ip = f'_NOID_[{ip}]'
    1.80  
    1.81      else:
    1.82 @@ -295,7 +320,7 @@
    1.83  def make_error_response(
    1.84          code: int, err: Union[Exception, str],
    1.85          msg: str = None,
    1.86 -        remove_cookies: Optional[List[str]] = None,
    1.87 +        remove_cookies: Optional[List[Union[str, Cookie]]] = None,
    1.88          cookies: Optional[List[Cookie]] = None
    1.89  ) -> bottle.HTTPResponse:
    1.90      """\
    1.91 @@ -323,8 +348,12 @@
    1.92          'msg': err_msg,
    1.93      }, code, cookies)
    1.94  
    1.95 -    if remove_cookies is not None:
    1.96 -        for cookie_name in remove_cookies:
    1.97 -            res.delete_cookie(cookie_name)
    1.98 +    if remove_cookies is not None and remove_cookies:
    1.99 +        for cookie in remove_cookies:
   1.100 +            if isinstance(cookie, Cookie):
   1.101 +                cookie.response_delete(res)
   1.102 +
   1.103 +            else:
   1.104 +                res.delete_cookie(cookie)
   1.105  
   1.106      return res