Sto cercando di utilizzare i decoratori per gestire il modo in cui gli utenti possono accedere o meno alle risorse all'interno di un'applicazione Web (in esecuzione su Google App Engine). Tieni presente che non autorizzo gli utenti ad accedere con i loro account Google, pertanto l'impostazione di diritti di accesso specifici a percorsi specifici all'interno di app.yaml non è un'opzione.Decoratori Python ed ereditarietà delle classi
ho usato le seguenti risorse:
- Bruce Eckel's guide to decorators
- SO : get-class-in-python-decorator2
- SO : python-decorators-and-inheritance
- SO : get-class-in-python-decorator
Tuttavia io sono ancora un po 'confuso ...
Ecco il mio codice! Nell'esempio seguente, current_user è un metodo @property che appartiene alla classe RequestHandler. Restituisce un oggetto User (db.model) memorizzato nel datastore, con un livello 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...
Tuttavia, la mia applicazione utilizza controller diversi per diversi tipi di risorse. Per poter utilizzare il decoratore @requiredLevel all'interno di tutte le sottoclassi, ho bisogno di spostarlo nella classe genitore (RequestHandler):
class RequestHandler(webapp.RequestHandler):
#Access decorator
def requiredLevel(required_level):
#See code above
La mia idea è quella di accedere il decoratore in tutte le sottoclassi controller utilizzando il seguente codice:
class FoobarController(RequestHandler):
@RequestHandler.requiredLevel(100)
def get(self):
#do stuff here...
Penso di aver appena raggiunto il limite delle mie conoscenze sui decoratori e sull'eredità di classe :). Qualche idea ?
Perché è un metodo sulla classe? Ciò causerà solo la rottura delle cose e funzionerà solo come una funzione normale all'interno della classe in cui è stato definito. A meno che non si sia su 3.x, nel qual caso probabilmente funzionerà correttamente. –
Il decoratore è un metodo sulla classe perché non ho ancora capito come codificare un decoratore come classe 1/che accetta argomenti e 2/che può accedere ai metodi della classe corrente stessa. È questo che intendevi? Essendo per lo più autodidatta, ho difficoltà a comprendere appieno la guida, i decoratori e l'eredità di Bruce Eckell. – jbmusso
Si potrebbe semplicemente copiare e incollare la funzione al di fuori della classe e funzionerebbe correttamente. Basterebbe rispondere alla tua domanda? –