py.lib
2022-08-27
Parent:483727ff89c4
py.lib/webapp/bottle_urils.py
+ Возможность удаления cookie по полному объекту (полезно, когда выставляются особые параметры на cookie, и их не удаётся удалить по имени)
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