2012-04-07 8 views
0

Okay Das ist was ich habe:Python Server-Betreiber nur Dekorateure

Ich spiele um mit authengine von Scotch und kann nicht herausfinden, wie man einen Admin-Dekorateur zu machen. her der Code seiner eher einfach:

class Jinja2Handler(webapp2.RequestHandler): 
""" 
    BaseHandler for all requests all other handlers will 
    extend this handler 

""" 
@webapp2.cached_property 
def jinja2(self): 
    return jinja2.get_jinja2(app=self.app) 

def get_messages(self, key='_messages'): 
    try: 
     return self.request.session.data.pop(key) 
    except KeyError: 
     return None 

def render_template(self, template_name, template_values={}): 
    messages = self.get_messages() 
    if messages: 
     template_values.update({'messages': messages}) 
    self.response.write(self.jinja2.render_template(
     template_name, **template_values)) 

def render_string(self, template_string, template_values={}): 
    self.response.write(self.jinja2.environment.from_string(
     template_string).render(**template_values)) 

def json_response(self, json): 
    self.response.headers.add_header('content-type', 'application/json', charset='utf-  8') 
    self.response.out.write(json) 

def UserArea(fuct): 

    def Usercheck(): 
     return Usercheck 


class PageHandler(Jinja2Handler): 

def root(self): 
    session = self.request.session if self.request.session else None 
    user = self.request.user if self.request.user else None 
    profiles = None 
    emails = None 
    if user: 
     profile_keys = [ndb.Key('UserProfile', p) for p in user.auth_ids] 
     profiles = ndb.get_multi(profile_keys) 
     emails = models.UserEmail.get_by_user(user.key.id()) 
    self.render_template('home.html', { 
     'user': user, 
     'session': session, 
     'profiles': profiles, 
     'emails': emails, 
    }) 

@UserArea 
class UserHandler(Jinja2Handler): 

def get(self): 
    self.render_template('index-2.html', { 

    }) 

Skipping das Einrücken Fehler ... Ich kann nicht scheinen, um herauszufinden, ... Ich habe gelesen, dachte, die How to make a chain of function decorators? dachten, dass ich für sie das grundlegende Verständnis hatte .... aber keine

Jede Hilfe mich in der richtigen Art und Weise zeigen ...

der Fehler ich eine Menge zu bekommen Naht ist Typeerror: ‚NoneType‘ Objekt ist nicht aufrufbar

Antwort

0
def UserArea(fuct): 

    def Usercheck(): 
     return Usercheck 

Sie verwenden dies als Dekorateur, aber es gibt nichts zurück, so dass es None zurückgibt. Wenn Sie also versuchen, die dekorierte Klasse zu instanziieren, rufen Sie None() an und offensichtlich funktioniert das nicht. Außerdem gibt die Wrapper-Funktion nur sich selbst zurück, was selten das ist, was Sie wollen.

Es ist schwer zu sagen, was Sie der Dekorateur zu tun, eigentlich wollen, aber in der Regel Dekorateure geschrieben etwas wie folgt aus:

import functools 

def UserArea(func): 

    @functools.wraps(func) 
    def usercheck(*args, **kwargs): 
     if adminuser: # however this gets defined 
      return func(*args, **kwargs) 
     else: 
      raise Exception("not authorized") 

    return usercheck 

Beachten Sie, dass die innere Funktion, die als Wrapper für die dekorierten Objekt verwendet wird ruft das dekorierte Objekt auf und gibt sein Ergebnis zurück, sodass es als direkter Ersatz für das dekorierte Objekt im Clientcode verwendet werden kann. Wenn Ihre Wrapper-Funktion dies nicht tut, ist Ihr Dekorateur ziemlich kaputt.

Als eine weitere Anmerkung, sehe ich, dass Sie dies als Klassen-Dekorator verwenden, was bedeutet, dass es aufgerufen wird, wenn die Klasse instanziiert wird. Die Verwendung eines Klassendekorators, der eine Funktion zurückgibt, erschwert das Unterklassen-Klassifizieren, da die tatsächliche Klasse keinen öffentlichen Namen mehr hat. Es könnte daher sinnvoller sein, einige oder alle Methoden der Klasse anstatt der Klasse selbst zu dekorieren.

+0

Danke für die schnelle Antwort ... ich suche ziemlich genau was du gepostet hast .... ich glaube, ich hatte Probleme mit meinem Kopf um den Wrapper Teil der Dekorateur ... nach dem Sehen ging das zurück und sah es über und ausgecheckt functools .... (neu zu Python, Bauarbeiten für einen Lebensunterhalt) lol und weiter auf einige der Methoden statt der Klasse zu dekorieren könnte eine gute Idee sein, im Moment nur mit ihm, um Benutzerbereich zur Verfügung zu stellen. Also ist das Dekorieren der Klasse in Ordnung, aber gut für die Zukunft. Danke –

+0

Das Zurückgeben einer Funktion von einem Klassen-Dekorator wird größere Probleme haben als das Benennen - es wird die dekorierte Klasse durch eine Funktion ersetzen! –

Verwandte Themen