CherryPy Benutzerdefinierte Tool für die Benutzer-Authentifizierung

Ich versuche, eine einfache Art der Dekoration Methoden in meinem CherryPy-controller-Klassen, so dass ein Benutzer auf die Anmeldeseite umgeleitet, wenn Sie noch nicht authentifiziert noch. Ich wollte eine grundlegende Python-decorator, aber hier eine Antwort schlug ich ein CherryPy Benutzerdefiniertes Tool statt. Ich versuche also das zu tun, aber ich kann nicht ankommen es zu wirken. Hier ist, was ich habe:

def authenticate():
    user = cherrypy.session.get('user', None)
    if not user:
        raise cherrypy.HTTPRedirect('/?errMsg=Please%20log%20in%20first')

cherrypy.tools.authenticate = cherrypy.Tool('on_start_resource', authenticate)

Den /home Seite ist eine Seite, die sollte auf authentifizierte Benutzer beschränkt, so habe ich diese:

@cherrypy.expose
@cherrypy.tools.authenticate
def home(self, **kwargs):
    tmpl = TemplateDir.get_template('home.mako')
    return tmpl.render()

Aber ich bekomme diese Fehlermeldung, wenn ich versuche zu starten, meine web-site:

Traceback (most recent call last):
  File ".\example.py", line 3, in <module>
    from controller.main import Root
  File "C:\...\controller\main.py", line 9, in <module>
    class Root(BaseModule):
  File "C:\...\controller\main.py", line 19, in Root
    @cherrypy.tools.authenticate
  File "C:\Python26\lib\site-packages\cherrypy\_cptools.py", line 119, in
   __call__ % self._name)
TypeError: The 'authenticate' Tool does not accept positional arguments; you must
  use keyword arguments.

Edit: okay, wenn ich meine Nutzung der custom-tool zu Klammern, ich bekomme eine andere Fehlermeldung.

@cherrypy.expose
@cherrypy.tools.authenticate() # Magic parentheses...
def home(self, **kwargs):
    ...

Nun bekomme ich:

Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\cherrypy\_cprequest.py", line 625, in respond
    self.hooks.run('on_start_resource')
  File "C:\Python26\lib\site-packages\cherrypy\_cprequest.py", line 97, in run
    hook()
  File "C:\Python26\lib\site-packages\cherrypy\_cprequest.py", line 57, in __call__
    return self.callback(**self.kwargs)
  File ".\example.py", line 40, in authenticate
    user = cherrypy.session.get('user', None)
AttributeError: 'module' object has no attribute 'session'

Edit: habe ich Sitzungen, drehte sich auf:

cherrypy.tools.sessions.storage_type = 'file'
cherrypy.tools.sessions.storage_path = r'%s\sessions' % curDir
cherrypy.tools.sessions.timeout = 60
cherrypy.tree.mount(Root(), "/", config={
    '/static': {
        'tools.staticdir.on':True,
        'tools.staticdir.dir':r'%s\static' % curDir,
    },
    '/': {
        'tools.sessions.on':True,
    }
})

Wenn ich laden Sie zunächst die Seite mit meinem custom-tool-decorator auf der web-Methode, bekomme ich diesen Fehler:

AttributeError: 'module' Objekt hat kein Attribut 'session'

Dann, wenn ich die Seite neu laden, bekomme ich diesen Fehler:

AttributeError: '_Serving' - Objekt hat kein Attribut 'session'

Edit: auch versuchen, so viel in meiner controller-Klasse, ich bekomme immer noch die "Modul-Objekt hat kein Attribut session' Fehler:

class Root(BaseModule):
    _cp_config = {'tools.sessions.on': True}
    sess = cherrypy.session # Error here
    ...
Schreibe einen Kommentar