我在App Engine中enabled sessions,在部署应用程序时效果非常好。我的问题是,这似乎不适用于开发模式。我需要在开发模式下将某些内容(磁盘,数据存储区,内存)持久化,以便每次重新启动本地服务器时都不必登录我的应用程序(每次我更改服务器或共享代码时) 。
我通常通过在jetty-web.xml中定义HashSessionManager来实现这一点,但出于安全原因,显然(并且可以理解)App Engine explicitly disables配置文件。
有没有人知道在App Engine中实现本地会话持久性的标准方法,假设存在一个?
我在appengine-web.xml中有以下相关行:
<sessions-enabled>true</sessions-enabled>
<async-session-persistence enabled="true" />
我正在使用App Engine SDK的1.6.5版(最新版)。
以下是我采取的一些步骤:
在扩展RemoteServiceServlet的服务器端类中,我添加了以下行:
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
// Added this line
System.out.println(request.getSession().getCreationTime());
...
}
我重新启动了开发模式服务器,加载了我的应用程序并为我的应用程序发出的每个请求获得了“1337796704817”,表明请求之间正在使用相同的会话。然后,我重新启动开发模式服务器,下一个请求生成“1337796798184”,表示已创建新会话。
如下所述,我正在使用Google Cloud SQL,并且我已在应用引擎设置中禁用了数据存储选项,但这在部署时似乎不会导致任何问题。此外,我尝试了上述相同步骤并检查了这些选项,并得到了相同的结果。
答案 0 :(得分:0)
会话将持久保存到数据存储区。只要您每次重新启动dev_appserver都没有清除数据存储区,您的会话就应该保留。检查每次重新启动时是否清除数据存储区。
答案 1 :(得分:0)
如果您设置了cookie_args.domain
值(如Webapp2 Sessions中所述),那么它将无法在您的开发服务器上运行。也就是说,如果域名设置为.mydomain.com
,那么它将无法从您的开发服务器localhost:8000
开始工作。
例如,如果您的main.py
包含这样的配置对象:
config = {
'webapp2_extras.sessions': {
'secret_key': '**secret_key**',
'cookie_args': {'domain': '.mydomain.com', 'httponly': True}
}
}
解决方案是编写一些条件代码:
import os
domain = None if os.environ['SERVER_SOFTWARE'].startswith('Development') else '.mydomain.com'
config = {
'webapp2_extras.sessions': {
'secret_key': '**secret_key**',
'cookie_args': {'domain': domain, 'httponly': True}
}
}
WSGIApplication(Routing, config=config, debug=True)