首先,我是 GAE 的新手,所以我可能以错误的方式执行此操作 - 但我之前使用过 PHP,而 session 是我保存持久数据的方式。我正在使用 Python 2.7,因为这是我在所有其他 Python 开发中使用的 - 尽管我开始怀疑降级到 2.5 是否可能是一个有效的解决方案,如果不是一个理想的解决方案。
场景是我正在构建一个概念验证站点,并且我需要一个“虚拟”登录按钮,该按钮只需设置一个名为'user'的会话变量,其值为'admin'。然后我想检查导航模板以查看是否设置了变量,如果是,我将添加一些额外的菜单命令。很简单。 (注意:我知道这不安全、不明智或不应该做任何事情 - 问题是会话不起作用,而不是我正在用它做什么 - 我正在使用代码中做其他几件事会话 - 部署时它们都不起作用)
似乎有几个不同的 GAE 与 Python 会话库,我尝试了谷歌搜索中最广泛推荐的一个 - gaeutilities,但这会导致错误并且不起作用(我最终偶然发现了这篇文章来解释它只是与 Python 2.7 不兼容)。多一点搜索让我从 appenginelearn.com 找到了这个库,我把它放进去,它工作得很好……直到我部署了它——然后它什么也没做。我想要一些关于为什么这可能会失败的指示或建议。这是我正在使用的相关代码:
我将 appenginelearn.com 中的 util 库目录放在应用程序目录的根目录下,然后导入 Session:
from util.sessions import Session
然后我添加了 Login 和 Logout 类:
class LogIn(webapp2.RequestHandler):
def get(self):
self.session = Session()
self.session['user'] = 'admin'
# Return the user to the page they logged in from
referer = self.request.environ['HTTP_REFERER'] \
if 'HTTP_REFERER' in self.request.environ \
else '/'
self.redirect(referer)
class LogOut(webapp2.RequestHandler):
def get(self):
self.session = Session()
self.session.delete_item('user')
self.redirect('/')
以及主类中的以下(糟糕的)代码(这将在演示中的所有页面上完成)
class MainPage(webapp2.RequestHandler):
def get(self):
self.session = Session()
logging.info('Main page fired up')
if 'user' in self.session:
user = self.session['user']
else:
user = None
template_values = {
'user': user
}
template = jinja_environment.get_template('main.html')
self.response.out.write(template.render(template_values))
然后在 HTML 模板文件中
{% if user %}
<p>Welcome, {{user}}</p>
{% endif %}
以及日志中的错误:
2012-10-04 02:51:28.084 /login 302 143ms 0kb Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4
*ip address removed* - - [04/Oct/2012:02:51:28 -0700] "GET /login HTTP/1.1" 302 136 "*site-removed*" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4" "*site-removed*" ms=144 cpu_ms=0 cpm_usd=0.000015 instance=*instance removed*
**I** 2012-10-04 02:51:28.080
Creating session session-*session number removed*
**E** 2012-10-04 02:51:28.084
Set-Cookie: appengine-simple-session-sid=*session number removed*; Path=/