def requires_permission(permission):
    def decorator(func):
      def wrapper(*args, **kwargs):
        # Проверка прав доступа пользователя
        if has_permission(get_current_user(), permission):
          return func(*args, **kwargs)
        else:
          return "Доступ запрещен"  # Или перенаправление
      return wrapper
    return decorator
  @requires_permission("edit_posts")
  def edit_post(post_id):
    # Логика редактирования поста
    return "Пост успешно отредактирован"
  Декоратор для проверки прав доступа позволяет элегантно и многократно использовать логику проверки доступа к различным функциям или классам в приложении. Вот как это работает:
Основная идея:
Пример кода:
    def requires_permission(permission):
      """Декоратор, проверяющий наличие указанного права доступа."""
      def decorator(func):
        def wrapper(*args, **kwargs):
          # Получаем пользователя (например, из сессии, запроса, и т.д.)
          user = get_current_user()
          if user and user.has_permission(permission):
            # У пользователя есть необходимые права, выполняем функцию
            return func(*args, **kwargs)
          else:
            # У пользователя нет прав, возвращаем ошибку
            return "У вас нет прав доступа для выполнения этой операции."
            # Или можно выбросить исключение:
            # raise PermissionDenied("У вас нет прав доступа.")
        return wrapper
      return decorator
    # Вспомогательная функция для получения текущего пользователя (пример)
    def get_current_user():
      # Здесь должна быть логика получения пользователя из вашего контекста (например, сессии, запроса)
      # Возвращаем объект пользователя или None, если пользователь не аутентифицирован.
      # Это заглушка, нужно адаптировать под вашу систему аутентификации.
      return None # Пример: возвращаем None, если пользователь не аутентифицирован
    class User:
      def __init__(self, role):
        self.role = role
      def has_permission(self, permission):
        # Проверяем, есть ли у пользователя право доступа
        if permission == "admin" and self.role == "admin":
            return True
        return False
    # Пример использования декоратора
    @requires_permission("admin")
    def admin_only_function():
      return "Функция доступна только администраторам."
    #Пример создания объекта пользователя (для тестов)
    user1 = User("admin")
    def get_current_user():
      return user1
    print(admin_only_function()) # Выведет "Функция доступна только администраторам."
    user2 = User("user")
    def get_current_user():
      return user2
    print(admin_only_function()) # Выведет "У вас нет прав доступа для выполнения этой операции."
  Объяснение:
requires_permission(permission) - это декоратор, который принимает право доступа (например, "read", "write", "admin") в качестве аргумента.get_current_user() - это фиктивная функция, которая должна возвращать объект текущего пользователя.  В реальном приложении это может быть, например, получение пользователя из сессии, базы данных или JWT токена.  Важно, что эта функция должна соответствовать вашей системе аутентификации.user.has_permission(permission) - это метод объекта пользователя, который проверяет, имеет ли пользователь указанное право доступа.  В реальном приложении это может включать проверку ролей пользователя, членства в группах, наличие определенных разрешений и т.д.@requires_permission("admin") -  применяет декоратор к функции admin_only_function(). Теперь, когда вызывается admin_only_function(), сначала будет выполнена обертка, которая проверит права доступа.Преимущества использования декораторов для проверки прав доступа:
@requires_permission.Важные моменты:
В заключение, декораторы - мощный инструмент для реализации проверки прав доступа в приложениях Python, обеспечивающий чистый, читаемый и поддерживаемый код.