Ich versuche, Dekoratoren zu verwenden, um zu verwalten, wie Benutzer auf Ressourcen innerhalb einer Webanwendung (die auf Google App Engine läuft) zugreifen können oder nicht. Beachten Sie, dass ich Nutzern die Anmeldung mit ihren Google-Konten nicht gestatten. Daher ist es nicht möglich, bestimmte Zugriffsrechte für bestimmte Routen in app.yaml festzulegen.Python-Dekoratoren und Klassenvererbung
benutzte ich die folgenden Ressourcen:
- Bruce Eckel's guide to decorators
- SO : get-class-in-python-decorator2
- SO : python-decorators-and-inheritance
- SO : get-class-in-python-decorator
jedoch ein Ich bin immer noch verwirrt Bit ...
Hier ist mein Code! Im folgenden Beispiel ist current_user eine @property-Methode, die zur RequestHandler-Klasse gehört. Es gibt ein User (db.model) -Objekt zurück, das im Datenspeicher mit einer IntProperty() -Ebene gespeichert ist.
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...
Allerdings verwendet meine Anwendung verschiedene Controller für verschiedene Arten von Ressourcen. Um den @requiredLevel Dekorateur in allen Unterklassen zu verwenden, muß ich es die übergeordnete Klasse bewegen (Request):
class RequestHandler(webapp.RequestHandler):
#Access decorator
def requiredLevel(required_level):
#See code above
Meine Idee ist es, den Dekorateur in allen Controller-Subklassen für den Zugriff auf den folgenden Code:
Ich glaube, ich habe gerade die Grenze meines Wissens über Dekoratoren und Klassenvererbung erreicht :). Irgendwelche Gedanken?
Warum ist es eine Methode für die Klasse? Das wird nur dazu führen, dass Dinge kaputt gehen, und es funktioniert nur wie eine reguläre Funktion innerhalb der Klasse, in der es definiert wurde. Wenn Sie nicht auf 3.x sind, wird es wahrscheinlich in Ordnung funktionieren. –
Der Dekorator ist eine Methode für die Klasse, weil ich noch nicht herausgefunden habe, wie man einen Dekorator als eine Klasse 1/die Argumente akzeptiert und 2/die Methoden auf die aktuelle Klasse selbst zugreifen kann. Hast du das gemeint? Da ich hauptsächlich Autodidakt bin, habe ich Probleme, Bruce Eckells Leitfaden, Dekorateure und Nachlässe zu verstehen. – jbmusso
Sie könnten einfach die Funktion außerhalb der Klasse kopieren und einfügen, und es würde gut und normal funktionieren. Wäre das genug, um deine Frage zu beantworten? –