首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用户身份验证的CherryPy自定义工具

用户身份验证的CherryPy自定义工具
EN

Stack Overflow用户
提问于 2011-07-01 18:45:34
回答 2查看 7K关注 0票数 4

我试图在我的CherryPy控制器类中设置一种简单的方法来装饰方法,这样如果用户还没有通过身份验证,就可以重定向到登录页面。我本来打算做一个基本的Python装饰,但是答案在这里建议我使用一个CherryPy自定义工具。所以我试着去做,但我不能让它起作用。我现在拥有的是:

代码语言:javascript
运行
复制
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页面应该仅限于经过身份验证的用户,因此我有以下内容:

代码语言:javascript
运行
复制
@cherrypy.expose
@cherrypy.tools.authenticate
def home(self, **kwargs):
    tmpl = TemplateDir.get_template('home.mako')
    return tmpl.render()

但是,当我试图启动我的网站时,我会遇到以下错误:

代码语言:javascript
运行
复制
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.

编辑:,好的,如果我更改自定义工具的用法以使用括号,我会得到一个不同的错误。

代码语言:javascript
运行
复制
@cherrypy.expose
@cherrypy.tools.authenticate() # Magic parentheses...
def home(self, **kwargs):
    ...

现在我明白了:

代码语言:javascript
运行
复制
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'

编辑:,我打开了会话:

代码语言:javascript
运行
复制
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,
    }
})

当我第一次在web方法上加载带有自定义工具装饰器的页面时,我会得到以下错误:

AttributeError:“模块”对象没有属性“会话”

然后,当我重新加载页面时,会得到以下错误:

AttributeError:'_Serving‘对象没有属性’会话‘

编辑:甚至在我的控制器类中尝试了这么多,我仍然得到‘模块对象没有属性会话’错误:

代码语言:javascript
运行
复制
class Root(BaseModule):
    _cp_config = {'tools.sessions.on': True}
    sess = cherrypy.session # Error here
    ...
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-01 20:59:58

我用错钩子了。改变:

代码语言:javascript
运行
复制
cherrypy.tools.authenticate = cherrypy.Tool('on_start_resource', authenticate)

至:

代码语言:javascript
运行
复制
cherrypy.tools.authenticate = cherrypy.Tool('before_handler', authenticate)

解决了这个问题。显然,我的authenticate方法是在会话打开之前被调用的,所以它无法访问cherrypy.session。在我的控制器中,我不需要任何会话打开的东西;所需要的只是我的服务器启动脚本中的以下内容:

代码语言:javascript
运行
复制
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
    }, ...
})

然后,在我的控制器上使用一个受限的方法:

代码语言:javascript
运行
复制
@cherrypy.expose
@cherrypy.tools.authenticate()
def home(self, **kwargs):
    ...
票数 5
EN

Stack Overflow用户

发布于 2011-07-01 19:45:08

很可能没有启用会话。在会话wiki页面上有一个配置文件示例,或者看一下教程7

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6552025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档