首先,我是GAE的新手,所以我可能会以错误的方式做到这一点 - 但我之前使用过的是PHP,会话是我保持持久数据的方式。我正在使用Python 2.7,因为这是我用于所有其他Python开发的东西 - 尽管我开始怀疑降级到2.5是否可能是一个有效的解决方案,如果不是理想的解决方案。
场景是我正在构建一个概念验证网站,我需要一个“虚拟”登录按钮,只需设置一个名为'user'的会话变量,其值为'admin'。然后我想检查导航模板以查看变量是否已设置,如果是,我将添加一些额外的菜单命令。非常简单。 (注意:我知道这不安全,明智或任何应该做的事情 - 问题是会话不起作用,而不是我正在做的事情 - 我正在做其他一些事情使用会话的代码 - 部署后它们都没有工作)
似乎有几个不同的会话库用于GAE与Python,我尝试了在谷歌搜索中最广泛推荐的那个 - gaeutilities,但是这会导致错误并且不起作用(我最终偶然发现this post解释它与Python 2.7不兼容。再多一点搜索引导我进入appenginelearn.com的this库,我把它放进去并且它工作得很好......直到我部署它 - 然后它什么也没做。我会喜欢一些指示或建议,为什么这可能会失败。这是我正在使用的相关代码:
我将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=/
答案 0 :(得分:20)
你见过webapp2会话吗?它都是内置的,你可以马上开始。
https://webapp2.readthedocs.io/en/latest/api/webapp2_extras/sessions.html
此模块为webapp2提供轻量级但灵活的会话支持。 它有三个内置后端:安全cookie,内存缓存和数据存储。可以添加新的后端来扩展CustomBackendSessionFactory。 会话存储可以通过SessionStore.get_session()方法使用不同的密钥提供多个会话,甚至在同一请求中使用不同的后端。默认情况下,它使用配置中的默认密钥返回会话。
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:
# 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()
# To set a value:
self.session['foo'] = 'bar'
# To get a value:
foo = self.session.get('foo')
然后围绕这个建立一个登录系统真的很容易,似乎你已经完成了它。并且您可以将数据存储区和/或内存缓存与webapp2会话一起使用。