【问题标题】:Stuck retrieving parameters in sessions - GAE webapp2卡在会话中检索参数 - GAE webapp2
【发布时间】: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


【解决方案1】:

进一步看,我发现了一个对我有帮助的帖子 GAE webapp2 session handling not working when putting basehandler to a different file

经过一些修改,这里是我在 webapp2 中设置会话并在不同 .py 文件之间共享会话的方法。希望它可以节省其他人一些时间。

1) 创建 basehandler.py,这将需要使用会话的所有 .py 文件导入。这直接来自 Google 的文档:

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:
            webapp2.RequestHandler.dispatch(self)
        finally:
            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()

2) 创建 ma​​in.py 导入 BaseHandler。就我而言,我在会话中存储了一个值:

import os
import urllib
import webapp2
import jinja2
from basehandler import BaseHandler


JINJA_ENVIRONMENT = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
    extensions=['jinja2.ext.autoescape'])

class MainPage(BaseHandler):
    def get(self):

    self.session['foo'] = 'bar'    # Store a value in the session
                                   # you can store more than one :-)


    # Define values that will be passed onto the template 
    template_values = {
        'title': 'TITLE'
    }

    # search for an appropriate template and render it. 
    template =      JINJA_ENVIRONMENT.get_template('./templates/index.html')
    self.response.write(template.render(template_values))

config = {}
config['webapp2_extras.sessions'] = {   
'secret_key': 'my-super-secret-key'
}

application = webapp2.WSGIApplication([
    ('/', MainPage)
], config = config, debug = True)

3) 创建 another.py 同时注意导入 BaseHandler 并使用相同的密钥。在这里,您可以检索 main.py 或共享同一会话的任何其他 .py 文件存储的值:

import os
import urllib
import webapp2
import jinja2
from basehandler import BaseHandler


JINJA_ENVIRONMENT = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
    extensions=['jinja2.ext.autoescape'])

class AnotherPage(BaseHandler):
    def get(self):

    foo1 = self.session.get('foo')

    # Now go and do something with foo1, even store a new value as in main.py
    # ...
    # ...

    # Define values that will be passed onto the template 
    template_values = {
        'title': 'TITLE'
    }

    # search for an appropriate template and render it. 
    template =      JINJA_ENVIRONMENT.get_template('./templates/additional.html')
    self.response.write(template.render(template_values))

config = {}
config['webapp2_extras.sessions'] = {   
'secret_key': 'my-super-secret-key'
}

application = webapp2.WSGIApplication([
    ('/', AdditionalPage)
], config = config, debug = True)

【讨论】:

    猜你喜欢
    • 2014-10-03
    • 2012-08-15
    • 2012-12-14
    • 2014-08-04
    • 2016-06-05
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    相关资源
    最近更新 更多