Estoy intentando usar decoradores para gestionar la forma en que los usuarios pueden o no acceder a los recursos dentro de una aplicación web (ejecutándose en Google App Engine). Tenga en cuenta que no permitiré que los usuarios inicien sesión con sus cuentas de Google, por lo que establecer derechos de acceso específicos a rutas específicas dentro de app.yaml no es una opción.Decoradores de Python y herencia de clase
que utilizan los siguientes recursos:
- Bruce Eckel's guide to decorators
- SO : get-class-in-python-decorator2
- SO : python-decorators-and-inheritance
- SO : get-class-in-python-decorator
Sin embargo todavía estoy un poco confundido ...
Aquí está mi código! En el siguiente ejemplo, current_user es un método @property que pertenece a la clase RequestHandler. Devuelve un objeto User (db.model) almacenado en el almacén de datos, con un nivel 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...
Sin embargo, mi aplicación utiliza diferentes controladores para diferentes tipos de recursos. Para utilizar el decorador @requiredLevel dentro de todas las subclases, tengo que moverlo a la clase padre (RequestHandler):
class RequestHandler(webapp.RequestHandler):
#Access decorator
def requiredLevel(required_level):
#See code above
Mi idea es tener acceso a la decoradora en todas las subclases de controlador utilizando el siguiente código:
class FoobarController(RequestHandler):
@RequestHandler.requiredLevel(100)
def get(self):
#do stuff here...
Creo que acabo de llegar al límite de mi conocimiento sobre decoradores y herencia de clases :). Alguna idea ?
¿Por qué es un método en la clase? Eso solo hará que las cosas se rompan, y solo funcionará como una función normal dentro de la clase en la que se definió. A menos que estés en 3.x, en cuyo caso probablemente funcione bien. –
El decorador es un método en la clase porque aún no he calculado cómo codificar un decorador como una clase 1/que acepta argumento (s) y 2/que puede acceder a métodos para la clase actual. ¿Es esto lo que querías decir? Siendo en su mayoría autodidacta, tengo problemas para comprender completamente la guía, los decoradores y la herencia de Bruce Eckell. – jbmusso
Podrías simplemente copiar y pegar la función fuera de la clase, y funcionaría bien y con normalidad. ¿Sería eso suficiente para responder a tu pregunta? –