Я пытаюсь использовать декораторы, чтобы управлять тем, как пользователи могут или не могут получить доступ к ресурсам в веб-приложении (работает в Google App Engine). Обратите внимание, что я не разрешаю пользователям входить в систему со своими учетными записями Google, поэтому настройка определенных прав доступа к определенным маршрутам в app.yaml не является вариантом.Декораторы Python и наследование классов
Я использовал следующие ресурсы:
- Bruce Eckel's guide to decorators
- SO : get-class-in-python-decorator2
- SO : python-decorators-and-inheritance
- SO : get-class-in-python-decorator
Однако я все еще немного запутался ...
Вот мой код! В следующем примере current_user - это метод @property, который принадлежит классу RequestHandler. Он возвращает объект User (db.model), хранящийся в хранилище данных, с уровнем IntProperty().
class FoobarController(RequestHandler):
# Access decorator
def requiredLevel(required_level):
def wrap(func):
def f(self, *args):
if self.current_user.level >= required_level:
func(self, *args)
else:
raise Exception('Insufficient level to access this resource')
return f
return wrap
@requiredLevel(100)
def get(self, someparameters):
#do stuff here...
@requiredLevel(200)
def post(self):
#do something else here...
Однако мое приложение использует разные контроллеры для разных ресурсов. Для того, чтобы использовать @requiredLevel декоратора во всех подклассов, мне нужно, чтобы переместить его в родительский класс (RequestHandler):
class RequestHandler(webapp.RequestHandler):
#Access decorator
def requiredLevel(required_level):
#See code above
Моя идея заключается в том, чтобы получить доступ к декоратора во всех подклассов контроллера, используя следующий код:
class FoobarController(RequestHandler):
@RequestHandler.requiredLevel(100)
def get(self):
#do stuff here...
Я думаю, что я просто достиг предела своих знаний об декораторах и наследовании классов :). Есть предположения ?
Почему метод в классе? Это приведет к разрыву вещей, и оно будет работать только как регулярная функция внутри класса, в котором он был определен. Если вы не на 3.x, и в этом случае он, вероятно, будет работать нормально. –
Декоратор - это метод класса, потому что я еще не понял, как закодировать декоратор как класс 1 /, который принимает аргументы (аргументы) и 2 /, которые могут обращаться к методам текущего класса. Это то, что вы имели в виду? Будучи в основном самоучкой, у меня возникли проблемы с полным пониманием руководства, декораторов и наследования Брюса Эккелла. – jbmusso
Вы можете просто скопировать-вставить функцию вне класса, и она будет работать нормально и нормально. Этого будет достаточно, чтобы ответить на ваш вопрос? –