2011-01-05 13 views
0

Ich baue einen Groupon-y-Service, um App-Engine zu lernen. Ich möchte eine Liste von Konten erfassen, die sich auf der Website anmelden (mithilfe der Google-Authentifizierung). Was ist der beste Weg, dies zu tun? Da ich die Google-Authentifizierung verwende, gibt es keinen einzigen Zeitpunkt, an dem sie sich anmelden. Sie könnten sich bei jeder URL einloggen. HierTrack Logins in Appengine

ist, was ich versucht habe:

  • eine force_login Funktion zu Beginn eines jeden einzelnen Request-Handler, der eine get_or_insert tut
  • Ich glaube, ich @login_required Unterklasse könnte, aber ich muss noch Dekorateure erinnern an Alle meine Anforderungshandler

Gibt es nicht eine Möglichkeit, direkt nach dem Login zu haken, und einige Logik zu registrieren?

Antwort

0

Es gibt keine Möglichkeit, Code sofort nach der Anmeldung auszuführen, außer, wie Sie gesagt haben, daran zu denken, es am Anfang jedes Handlers oder in einem Decorator auf jedem Handler zu tun. Der Dekorateur klingt wie eine bessere Option.

1

Sie könnten einen Dekorateur verwenden - Sie müssen sich daran erinnern, ihn vor jeden Handler zu stellen, der sich sowieso anmelden muss - oder Sie könnten in einem Basis-RequestHandler alle meine Handler erweitern (meine persönliche Präferenz), oder Sie könnten eine WSGI-Middleware schreiben, die das tut. Es liegt an dir.

0

Wie würden Sie einen Dekorateur schreiben?

Ähnliches wie [RequiresAuthentication] in .net MVC?

class Importer(webapp.RequestHandler): 
    @RequiresAuthentication 
    def get(self): 
     pass 



def RequiresAuthentication(fn): 
    def authorize(self): 
     if not users.get_current_user(): 
      self.redirect(users.create_login_url(self.request.uri)) 
     else: 
      return fn(self) 
    return authorize 

Ich habe gerade oben in der Test-App getestet und es schien zu funktionieren.

Nachdem bei @login_required suchen, um es für die Post nicht funktioniert:

def login_required(handler_method): 
    """A decorator to require that a user be logged in to access a handler. 

    To use it, decorate your get() method like this: 

    @login_required 
    def get(self): 
     user = users.get_current_user(self) 
     self.response.out.write('Hello, ' + user.nickname()) 

    We will redirect to a login page if the user is not logged in. We always 
    redirect to the request URI, and Google Accounts only redirects back as a GET 
    request, so this should not be used for POSTs. 
    """ 
    def check_login(self, *args): 
    if self.request.method != 'GET': 
     raise webapp.Error('The check_login decorator can only be used for GET ' 
         'requests') 
    user = users.get_current_user() 
    if not user: 
     self.redirect(users.create_login_url(self.request.uri)) 
     return 
    else: 
     handler_method(self, *args) 
    return check_login 
+0

ich nicht Ihren Beitrag gelesen. Ich habe gerade @login_required implementiert – DerpDerp