【问题标题】:Webapp2: Get session value from BaseHandler methodWebapp2:从 BaseHandler 方法获取会话值
【发布时间】:2013-08-19 15:01:47
【问题描述】:

我正在关注 webapp2 会话文档:http://webapp-improved.appspot.com/api/webapp2_extras/sessions.html

BaseHandler 有一个类方法check_cls_login 在这里我需要检查会话密钥“登录”是否存在。我试过self.session.get("login"),但它返回错误:AttributeError: 'cached_property' object has no attribute 'get'

还定义了一个名为check_login的函数,它也返回错误:AttributeError: 'MainHandler' object has no attribute 'session_store'

Base.py

import webapp2
from webapp2_extras import sessions

class BaseHandler(webapp2.RequestHandler):
    def dispatch(self):
       # Get a session store for this request.
       self.session_store = sessions.get_store(request=self.request)

       try:
         # Dispatch the request.
         webapp2.RequestHandler.dispatch(self)
       finally:
         # Save all sessions.
         self.session_store.save_sessions(self.response)

    @webapp2.cached_property
    def session(self):
       # Returns a session using the default cookie key.
       return self.session_store.get_session()

    def check_cls_login(self):
        # Check whether session key "login" is exist or not
        value = self.session.get("login")

def check_login(cls):
    # Check whether session key "login" is exist or not
    value = cls.session.get("login")

main.py

from Base import BaseHandler

class MainHandler(BaseHandler):
   def __init__(self, request, response):
    super(BaseHandler, self).__init__(request, response)
    BaseHandler.check_cls_login() # AttributeError: 'cached_property' object has no attribute 'get'

    self.check_cls_login() # AttributeError: 'cached_property' object has no attribute 'get'

    check_login(self) # AttributeError: 'MainHandler' object has no attribute 'session_store'

【问题讨论】:

    标签: google-app-engine session python-2.7 webapp2


    【解决方案1】:

    您应该使用self.check_login() 而不是BaseHandler.check_login()。 并且 check_login 不应该是一个类方法。

    【讨论】:

    • 同样的错误:AttributeError: 'cached_property' object has no attribute 'get'
    • check_login 不是类方法。像这样装饰,我猜调用 self.check_login() 与调用 BaseHandler.check_login() 相同
    • (编辑以扩展我的意思......在python代码中不常见以'self'作为参数的类方法,它让我感到震惊,它通常是'cls')
    • 啊,我应该多注意一下。调度发生在初始化之后,因此您的会话尚未设置。在处理程序中覆盖 init 是不寻常的,您很可能需要将其合并到调度中。
    • @Greg 谢谢格雷格。这样就解决了问题。
    猜你喜欢
    • 2013-10-20
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 2014-09-13
    相关资源
    最近更新 更多