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
...
Du musst angemeldet sein, um einen Kommentar abzugeben.
War ich mit den falschen Haken. Änderung:
Zu:
Das problem behoben. Anscheinend ist mein
authenticate
Methode war immer aufgerufen, bevor Sitzungen hatte, eingeschaltet worden ist, so dass es konnte nicht aufcherrypy.session
. Ich brauchte keine session-turn-on Zeug in meinem Controller, all, der notwendig war, wurde Folgendes in meine server-start-Skript:Dann, in meinem controller auf eine eingeschränkte Methode:
Wahrscheinlich die Sitzungen sind nicht aktiviert. Es ist ein Beispiel für die config-Datei auf dem Sitzung-wiki-Seite, oder haben Sie einen Blick auf tutorial #7.