【发布时间】:2015-03-16 10:14:33
【问题描述】:
我正在尝试通过 GAE 让会话与 Webapp2 一起使用,但我无法检索存储的参数。也许我忽略了显而易见的事情。
我在 webapp2 会话中存储值的 main.py 的简化版本:
import webapp2
from webapp2_extras import sessions
other imports...
class BaseHandler(webapp2.RequestHandler): # Copied from Google's doc
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()
class MainPage(webapp2.RequestHandler): # My main page proper
def get(self):
self.session['foo'] = 'bar' # Store somehing in the session
template_values = {
}
template = JINJA_ENVIRONMENT.get_template('index.html')
self.response.write(template.render(template_values))
application = webapp2.WSGIApplication([
('/', MainPage, ),], debug = True)
我的问题是如何从另一个模块访问存储在会话中的值。在 test.py 中,我执行以下操作:
from webapp2_extras import sessions
import main
other imports ...
class Test(main.BaseHandler):
def post(self):
foo1 = self.session.get('foo')
return foo1
class ProductsPage(webapp2.RequestHandler):
def get(self):
foo2 = Test.post()
...
但我收到以下错误: TypeError: 未绑定的方法 post() 必须以 Test 实例作为第一个参数调用(什么都没有)
我只是找不到正确的方法来使用 Test 类并检索存储在会话中的值。我在使用类的时候一定是忽略了一些东西,但是我被卡住了,找不到出路。
也许有人从外面看会很容易发现它?
【问题讨论】:
-
您是否按照例如 stackoverflow.com/questions/14078054/… 正确设置了会话?无论如何,如果没有
Test的实例作为第一个参数,您肯定不能调用未绑定方法Test.post—— 那是 Python 101,完全独立于 App Engine、webapp2 或会话。 (Login的来源是个谜)。为什么你仍然需要Test- 为什么不将继承和功能直接汇总到ProductsPage?! -
嗨,亚历克斯,我确实根据您的链接进行了设置。我错误地复制了错误的错误信息。现在已更正:测试而不是登录。我明白你的意思,我需要 products.py 中的 Basehandler 实例。它主要工作,但我正在研究如何在 products.py 中创建一个。有什么想法吗?
-
我认为你应该有
ProductsPage本身的子类main.BaseHandler,所以它会有自己的self.session来使用。顺便说一句,我很困惑您的MainPage没有子类化BaseHandler就可以工作! -
嗨,Alex,找到了解决方案。我把它贴在下面。你的建议给了我如何进一步研究的线索。谢谢!
标签: python google-app-engine session