我将视图,模型和网址存储在一个模块中,然后由我的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
答案 0 :(得分:0)
会话在类级别没有任何价值,因此在类上使用装饰器不会起作用。您可以在def GET(self)
上使用装饰器(您必须稍微更改authenticate()
,但它的想法相同。)