在客户端会话中存储复合字典



我正在使用服务器端会话,但后来我发现它们仍然依赖于客户端会话,因此我试图更好地掌握在会话中存储复合但微小结构的细节。

我们在会话中存储计数器i。在前 3 个请求中的每一个请求中,我们都会插入一个字典a一个新的键:值对。

在第三次和随后的重新加载(请求(中,下面的代码卡在elif session['counter']['i'] == 2:条件上。第三个从未达到。为什么?

from flask import Flask, session, render_template_string
app = Flask(__name__)
app.config['SECRET_KEY'] = 'KLMNOP'
@app.before_first_request
def ensure_session_is_initialized():
    if not session.has_key('a'):
        session['a'] = {}
    if not session.has_key('counter'):
        session['counter'] = {}
        session['counter']['i'] = 0
@app.route('/')
def index():
    session['counter']['i'] += 1
    if session['counter']['i'] == 1:
        session['a']['1'] = 'K'
    elif session['counter']['i'] == 2:
        session['a']['2'] = 'L'
    elif session['counter']['i'] == 3:
        session['a']['3'] = 'M'
    return render_template_string('''
    <body>
    {% for alpha in session %}
        KEY1: {{ alpha }}<br />
        {% for num in session[alpha] %}
            KEY2KEY2: {{ num }}:{{ session[alpha][num] }}<br />
        {% endfor %}
    {% endfor %}
    </body>
    ''')
if __name__ == '__main__':
    app.run(debug=True)

更新

thangtn找到了答案,但最好有一个理由来解释为什么独立代码

session = {}
session['counter'] = {}
session['counter']['i'] = 0
for i in range(5):
    session['counter']['i'] += 1
print session['counter']['i']

打印5如我们所期望的那样,但视图函数中类似的"复合字典"代码需要修订。

我发现当会话['计数器']['i] == 1 时,会话不会更新会话['计数器'] 的值。这就是为什么你的 if 子句在会话['计数器']['i'] == 2 停止。我还没有弄清楚为什么,但是当我通过重新分配session['counter']的值来更新"i"时,您的代码有效:

def index():
    i = session['counter']['i'] + 1
    session['counter'] = {'i': i}
    ...

最新更新