Исходный код decorators

# -*- coding: utf-8 -*-
# @Author: maxst
# @Date:   2019-07-21 11:33:54
# @Last Modified by:   MaxST
# @Last Modified time: 2019-08-08 21:05:12
import inspect
import logging
from functools import wraps

from dynaconf import settings

logger = logging.getLogger('decorators')


[документация]def get_name_by_frame(frame): """Получить имя по фрейму. Args: frame: Фрейм """ name = [] module = inspect.getmodule(frame) if module: name.append(module.__name__) if 'self' in frame.f_locals: name.append(frame.f_locals['self'].__class__.__name__) codename = frame.f_code.co_name if codename != '<module>': # top level usually name.append(codename) # function or a method del frame return '.'.join(name)
[документация]def log(func): """Декоратор логирования.""" @wraps(func) def wrapper(*args, **kwargs): stack = inspect.stack() caller_name = get_name_by_frame(stack[1][0]) curr_name = f'{func.__module__}.{func.__qualname__}' del stack logger.debug(f'caller "{caller_name}" call this "{ curr_name }"') return func(*args, **kwargs) return wrapper
[документация]def login_required(func): """Декоратор проверяющий авторизацию. Args: func: декорируемая функция Returns: Результат выполнения декорируемой функции Raises: TypeError: если пользователь не авторизован """ def checker(*args, **kwargs): serv = args[1] mes = args[2] con1 = getattr(mes, settings.ACCOUNT_NAME, '') con2 = getattr(mes, settings.SENDER, '') client = serv.names.get(mes.user_account_name) or serv.names.get(con1) or serv.names.get(con2) if not client: logger.critical('Ошибка login_required') raise TypeError return func(*args, **kwargs) return checker