Запись декоратора CherryPy для авторизации

У меня есть cherrypy приложение, и на некоторых представлениях я хочу начать только позволять определенным пользователям просматривать их, и отправить кто-либо еще к авторизации потребовал страницы.

Существует ли способ, которым я могу сделать это с пользовательским декоратором? Я думаю, что это было бы самой изящной опцией.

Вот основной пример того, что я хочу сделать:

class MyApp:
    @authorization_required
    def view_page1(self,appID):
        ... do some stuff ...
        return html

def authorization_required(func):
    #what do I put here?

Также authorization_required может функционировать при вызове, поскольку декоратор принимает параметры как allow_group1, allow_group2? Или мне нужен отдельный декоратор для каждой группы?

6
задан Greg 21 July 2010 в 19:08
поделиться

2 ответа

Хорошо, в этом случае ваш декоратор будет выглядеть примерно так:

# without any parameters
def authentication_required(f):
    @functools.wraps(f)
    def _authentication_required(*args, **kwargs):
        # Do you login stuff here
        return f(*args, **kwargs)
    return _authentication_required

# With parameters
def authentication_required(*allowed_groups):
    def _authentication_required(f):
        @functools.wraps(f)
        def __authentication_required(*args, **kwargs):
            # Do you login stuff here
            return f(*args, **kwargs)
        return __authentication_required
    return _authentication_required
4
ответ дан 8 December 2019 в 12:57
поделиться

Вы действительно не хотите писать пользовательские декораторы для CherryPy. Вместо этого вы хотите написать новый инструмент:

def myauth(allowed_groups=None, debug=False):
    # Do your auth here...
    authlib.auth(...)
cherrypy.tools.myauth = cherrypy.Tool("on_start_resource", myauth)

См. подробнее http://docs.cherrypy.org/en/latest/extend.html#tools. Это имеет несколько преимуществ перед написанием собственного декоратора:

  1. Вы получаете декоратор бесплатно из Инструмента: @cherrypy.tools.myauth(allowed_groups=['me']), и он уже знает, как не захламить cherrypy.exposed на той же функции.
  2. Вы можете применять Tools либо для каждого обработчика (с помощью декоратора), либо для каждого дерева контроллеров (через _cp_config), либо для каждого ERI-дерева (в конфигурационных файлах или dicts). Вы можете даже смешивать их и предоставлять базовую функцию через декораторы, а затем переопределять их поведение в конфигурационных файлах.
  3. Если в конфигурационном файле ваша функция отключена, вы не будете платить штраф за производительность, вызывая функцию декоратора только для того, чтобы проверить, отключена ли она.
  4. Вы не забудете добавить 'debug' arg, как во всех встроенных Инструментах. ;)
  5. Ваша функция может запускаться раньше (или позже, если вам это нужно), чем пользовательский декоратор, путем выбора другой "точки".
  6. Ваша функция может запускаться в нескольких точках, если это необходимо.
14
ответ дан 8 December 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: