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

时间:2017-02-15 19:38:40

标签: web.py

我将视图,模型和网址存储在一个模块中,然后由我的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'],但都没有。

我在Mac上使用web.py == 0.40.dev0

1 个答案:

答案 0 :(得分:0)

会话在类级别没有任何价值,因此在类上使用装饰器不会起作用。您可以在def GET(self)上使用装饰器(您必须稍微更改authenticate(),但它的想法相同。)