2017-02-15 9 views
0

私のビュー、モデル、およびURLはモジュールに格納されており、セッションストアが設定されている私のapp.pyによってインポートされます。私は - 私はここにhttp://webpy.org/cookbook/sessions_with_subappを説明したガイドラインに従うことにより、セッション変数を設定することができますが、私がこの例外web.ctx.sessionを使用しているときにweb.pyセッションにアクセスできない

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

が、これは私のapp.pyで取得しています一度私は私のセッションの値にアクセスすることはできません、私のビューを使用シャルムここ

from livereload import Server 

import web 

from nestpas.views import * 
from nestpas.urls import * 
import sys 

logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) 


app = web.application(urls, globals()) 
webapp = app.wsgifunc() 

# Setup session storage 
db = web.database(dbn='sqlite', db='dev.db') 
store = web.session.DBStore(db, 'sessions') 
session = web.session.Session(app, store, 
    initializer={'auth': 0} 
) 

def session_hook(): 
    web.ctx.session = session 

app.add_processor(web.loadhook(session_hook)) 

if __name__ == '__main__': 

    static_app = web.httpserver.StaticMiddleware(webapp) 
    server = Server(static_app) 
    server.watch('static/', 'templates/', 'nestpas/') 
    server.serve(port=8080, host='localhost') 

のように動作し、開発プロセスを簡素化するためにlivereloadを使用して、mは、私がここで

class Login: 
    def GET(self): 
     """ Login """ 
     render = web.template.render(base="admin") 
     return render.login({}) 

    def POST(self): 
     """ Handle login """ 
     inp = web.input() 
     if 'user_mail' in inp and 'user_pwd' in inp: 
      try: 
       user = User.get(
        User.mail == inp.user_mail, 
        User.password == inp.user_pwd 
       ) 
       logging.info("Login by user {}".format(user.id)) 
       web.ctx.session.auth = 1 
       logging.warn(web.ctx.session.auth) # Shows the value 

       raise web.seeother("/admin/") 
      except DoesNotExist: 
       logging.warning("Login attempt") 
       raise web.seeother("/login/") 
     else: 
      raise web.seeother("/login/") 

をセッション値を設定する方法です私はACCEにしようとする方法であります

def authenticate(klass): 
    logging.warn("- hello Kitty {}".format(
     web.ctx.session.auth 
    )) 
    return klass 

@authenticate 
class Admin: 
    def GET(self): 
     """ Admin """ 
     posts = BlogPost.select().order_by(
       BlogPost.when_created.desc() 
      ).paginate(0, 10) 

     render = web.template.render(base="admin") 
     return render.latest({ 
      "user_mail": "Kitty", 
      "blog_posts": posts 
     }) 

SSがセッションの値Iはまたweb.ctx.session.get()とweb.ctx.session [ 'AUTH']とweb.ctx [ 'セッション']が、それらの作業のどれを試し。

web.pyを搭載したMac上のイム== 0.40.dev0

答えて

0

セッションでは、クラスレベルで値を持たないので、クラスにデコレータを使用すると、動作しません。 def GET(self)にデコレータを使用することができます(authenticate()を少し変更する必要がありますが、それと同じ考えです)。

+0

ああ、私はクラスデコレータを使ってやりたいと思っていました。代わりにデコレータ? –

+0

はい、メソッドデコレータ。 – pbuck

関連する問題