2011-07-01 11 views
4

CherryPyコントローラクラスでメソッドをデコレートする簡単な方法を設定して、まだ認証されていないユーザがログインページにリダイレクトされるようにしようとしています。私は基本的なPythonのデコレータを行うつもりでしたが、代わりにan answer hereが私はCherryPyカスタムツールを使用することを提案しました。だから私はそれをしようとしているが、私はそれを働かせることはできない。ここで私が持っているものです。ユーザ認証のためのCherryPyカスタムツール

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' 

編集:私は最初のWebメソッドに私のカスタムツールデコレータでページをロードすると

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' object has no attribute 'session'

は、その後、私はページをリロードしたときに、私はこのエラーを取得:

AttributeError: '_Serving' object has no attribute 'session'

編集:も私のコントローラクラスでこれだけをしようと、私はまだエラー「モジュールオブジェクトには、属性のセッションを持っていない」GET:

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

答えて

5

私は間違ったフックを使用していました。変更:

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

へ:

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

は、問題を修正しました。どうやら私のauthenticateメソッドは、セッションがオンになる前に呼び出されていたので、cherrypy.sessionにアクセスできませんでした。私は自分のコントローラーでセッションを開始する必要はありませんでした。しかし、

@cherrypy.expose 
@cherrypy.tools.authenticate() 
def home(self, **kwargs): 
    ... 
0

ほとんどのセッションは有効になっていません。 session wiki pageに設定ファイルの例がありますか、tutorial #7を見てください。

+0

彼らは次のとおり制限された方法で私のコントローラでは、

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

その後:すべてのことが必要だったが、私のサーバー起動スクリプトに以下の通りでした。 :(私のセッション設定を表示する質問が更新されました。チュートリアル#7のリンクをチェックしています。 –

関連する問題