使用 web.ctx.session 时无法访问 web.py 个会话

Can't access web.py sessions when using web.ctx.session

我将我的视图、模型和 url 存储在一个模块中,然后由我的 app.py 导入,其中设置了会话存储。使用我的视图,我可以按照此处描述的指南设置会话变量 http://webpy.org/cookbook/sessions_with_subapp 但是一旦设置我的会话值我就无法访问它我得到这个异常

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

这是我的 app.py - 我正在使用 livereload 来简化像 sharm 一样工作的开发过程

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')

这是我设置会话值的方法

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/")

这是我尝试访问会话值的方式

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

我也尝试了 web.ctx.session.get() 和 web.ctx.session['auth'] 和 web.ctx['session'] 但其中 none 有效.

我在 mac web.py==0.40.dev0

session 在 class 级别没有值,因此在 class 上使用装饰器将不起作用。您可以在 def GET(self) 上使用装饰器(您必须稍微更改 authenticate(),但这是相同的想法。)