CherryPy Custom Tool для аутентификации пользователей - PullRequest
4 голосов
/ 01 июля 2011

Я пытаюсь настроить простой способ декорирования методов в моих классах контроллера CherryPy, чтобы пользователь перенаправлялся на страницу входа в систему, если они еще не аутентифицировались. Я собирался сделать базовый Python-декоратор, но ответ здесь предложил использовать вместо этого CherryPy Custom Tool. Я пытаюсь это сделать, но не могу заставить его работать. Вот что у меня есть:

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)

Страница /home - это страница, которая должна быть доступна только аутентифицированным пользователям, поэтому у меня есть это:

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

Тем не менее, я получаю эту ошибку при попытке запустить мой веб-сайт:

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.

Редактировать: хорошо, если я изменю свое использование пользовательского инструмента, чтобы иметь круглые скобки, я получу другую ошибку.

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

Теперь я получаю:

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'

Редактировать: У меня включены сессии:

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,
    }
})

Когда я впервые загружаю страницу с помощью своего собственного инструмента декоратора в веб-методе, я получаю эту ошибку:

AttributeError: у объекта 'module' нет атрибута 'session'

Затем, когда я перезагружаю страницу, я получаю эту ошибку:

AttributeError: у объекта '_Serving' нет атрибута 'session'

Редактировать: Даже пытаясь сделать так много в моем классе контроллера, я все равно получаю сообщение об ошибке «У объекта модуля нет сеанса атрибута»:

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

Ответы [ 2 ]

5 голосов
/ 02 июля 2011

Я использовал не тот крючок.Изменение:

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

Кому:

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

Исправлена ​​проблема.Очевидно, мой authenticate метод вызывался до того, как были включены сеансы, поэтому он не мог получить доступ к cherrypy.session.Мне не нужны были какие-то включающие сессию вещи в моих контроллерах;все, что было необходимо, было в моем сценарии запуска сервера:

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

Затем в моем контроллере по ограниченному методу:

@cherrypy.expose
@cherrypy.tools.authenticate()
def home(self, **kwargs):
    ...
0 голосов
/ 01 июля 2011

Скорее всего сеансы не включены.На странице вики сеанса приведен пример файла конфигурации, или посмотрите учебник # 7 .

...