【问题标题】:Set cookie/session that never expires even on browser close using Google App Engine (Python)使用 Google App Engine (Python) 设置即使在浏览器关闭时也永不过期的 cookie/会话
【发布时间】:2017-06-10 20:20:20
【问题描述】:

我正在尝试使用webapp2 sessionsbuilding a response 的文档在Google App Engine 中将cookie 设置为never expire(即使在浏览器关闭后)。我试过了:

代码 sn-p 1:

from webapp2
from webapp2_extras import sessions

class MainHandler(webapp2.RequestHandler):
    def never_expire_session(self):
        sessions.get_session(name='my_session', max_age=2147483647)

    @login_required
    def get(self):
    ....
    html_template = JINJA_ENVIRONMENT.get_template('index.html').render(myapp)
    self.response.out.write(html_template)

代码 sn-p 2:

class MainHandler(webapp2.RequestHandler):
    def never_expire_session(self):
        return self.response.set_cookie('my_session', max_age=2147483647)

    @login_required
    def get(self):
    ....
    html_template = JINJA_ENVIRONMENT.get_template('index.html').render(myapp)
    self.never_expire_session()
    self.response.out.write(html_template)

代码片段 2 的响应为 NoneNone。 (不确定第一个代码sn-p的输出。)

我也试过答案here,建议配置参数:

config = {}
config['webapp2_extras.sessions'] = {'session_max_age': 2147483647}
....
....
app = webapp2.WSGIApplication([
....
], debug=True, config=config)

我已经清除了我的 cookie,重新启动了我的浏览器,并检查了控制台,cookie 值显示为随机生成的数字和字母序列,并且 cookie 的到期时间设置为从 datetime.now 开始的一年。我试过的都没有用。

如何正确设置会话 cookie,使其永不过期,即使在浏览器退出时也是如此?

【问题讨论】:

  • 前两个 sn-ps 应该做什么?什么叫never_expire_session?为什么要在 cookie 和会话之间切换?
  • 我相信我应该根据我迄今为止阅读的文档和 Stackoverflow 问题使用 cookie。但是在这个post 中,@jwueller 指出,“会话使用 cookie,当浏览器关闭时它们会被删除,除非它们具有特定的生命周期。”据我了解,如果我延长会话最大年龄,它会做与使用 cookie 相同的事情吗?所以代码片段 1 和 2 本质上应该做同样的事情:延长会话最大年龄。我只是不知道该使用哪个。
  • 更新代码以包含我调用never_expire_session 的位置(在代码 sn-p 2 中)

标签: python google-app-engine session-cookies


【解决方案1】:

我遇到了一个缓存问题,导致我的会话 cookie 无法在开发者控制台中显示和应用。删除浏览器历史记录并重新启动计算机后,它清除了缓存。最终我得到它与以下工作:

from webapp2

class MainHandler(webapp2.RequestHandler):
    def get(self):
         the_value = ''.join(SystemRandom().choice(string.digits _ string.ascii_lowercase) for_in range (50))
         max_age = 2147483647
         # max age for Internet Explorer
         cookie_expires = datetime.datetime.now() + datetime.timedelta (200)
         return self.response.set_cookie('my_cookie', the_value, max_age=max_age, httponly=True, secure=True)

注意:如果您想将此更改应用到特定 cookie,请将“my_cookie”重命名为该 cookie(即,“SACSID”是许多 Google 应用程序上的 cookie)

【讨论】:

    【解决方案2】:

    我们甚至可以使用webapp2_extras.sessions 来做到这一点,不需要response.set_cookie(...)。 webapp2_extras.sessions 中有一个 default_config 字典,只需将 max_age 设置为 2147483647 或任何适合您的时间(以秒为单位),它应该可以工作。在我的情况下工作。查看official documentation 了解有关 default_config 的更多信息。

    sessions.default_config['cookie_args']['max_age'] = 2147483647
    

    【讨论】:

      猜你喜欢
      • 2011-04-21
      • 2015-08-12
      • 1970-01-01
      • 2016-07-07
      • 2016-05-20
      • 1970-01-01
      • 2014-08-14
      • 2012-08-20
      • 2018-04-15
      相关资源
      最近更新 更多