在App Engine中使用gae-sessions遇到问题,错误信息无帮助

0 投票
2 回答
677 浏览
提问于 2025-04-16 10:33

我在我的开发环境中安装了gae-sessions,但是它似乎没有存储任何东西。这里有一个基本的例子:

session = get_current_session()
session.get('some_num', 3)

然后在其他函数中...

session = get_current_session()
session['some_num'] = 4

这是我在控制台看到的错误:

KeyError: 'some_num'

这个错误信息并没有什么帮助。我很确定我按照说明一步一步来做的,但可能我漏掉了什么?

编辑

appengine_config.py

from gaesessions import SessionMiddleware
import os

def webapp_add_wsgi_middleware(app):
    app = SessionMiddleware(app, os.urandom(32))
    return app

出问题的代码

class Test(webapp.RequestHandler):
    def get(self):
        session = get_current_session()
        if session.is_active():
            # set session['some_num'] to whatever was in there or three, otherwise
            session['some_num'] = session.get('some_num', 3) 

            # later, session['some_num'] should exist and be equal to 3 ...
            assert session['some_num'] == 3

            # ... and is actually 'settable'
            session['some_num'] = 4
        else:
            self.response.out.write("Session is NOT active")

.is_active()没有返回true。

2 个回答

2

看这个示例应用(在这里),所有的会话一开始都是不活跃的,只有在你第一次给它存值的时候,它才会自动变成活跃状态。你只需要用 session['foo'] = 'bar' 这样的方式给会话存一个值,它就会自动激活。

另外,注意不要那样生成 cookie 的键。就像在示例的 appengine_config.py 文档中提到的:

# suggestion: generate your own random key using os.urandom(64)
# WARNING: Make sure you run os.urandom(64) OFFLINE and copy/paste the output to
# this file.  If you use os.urandom() to *dynamically* generate your key at
# runtime then any existing sessions will become junk every time you start,
# deploy, or update your app!
0

在你的代码中(现在的样子),你根本没有把 some_num 加入到你的会话字典里。你可以试试这样:

from gaesessions import get_current_session
session = get_current_session()
if session.is_active():
    # set session['some_num'] to whatever was in there or three, otherwise
    session['some_num'] = session.get('some_num', 3) 
...

# later, session['some_num'] should exist and be equal to 3 ...
assert session['some_num'] == 3

# ... and is actually 'settable'
session['some_num'] = 4

撰写回答