使用 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()
,但这是相同的想法。)
我将我的视图、模型和 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()
,但这是相同的想法。)