У меня есть 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? Или мне нужен отдельный декоратор для каждой группы?
Хорошо, в этом случае ваш декоратор будет выглядеть примерно так:
# 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
Вы действительно не хотите писать пользовательские декораторы для 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. Это имеет несколько преимуществ перед написанием собственного декоратора:
@cherrypy.tools.myauth(allowed_groups=['me'])
, и он уже знает, как не захламить cherrypy.exposed на той же функции. _cp_config
), либо для каждого ERI-дерева (в конфигурационных файлах или dicts). Вы можете даже смешивать их и предоставлять базовую функцию через декораторы, а затем переопределять их поведение в конфигурационных файлах.