Python 在客户端会话中存储复合dict

Python 在客户端会话中存储复合dict,python,session,flask,Python,Session,Flask,我正在使用服务器端会话,但后来我发现它们仍然依赖于客户端会话,因此我试图更好地掌握在会话中存储复合但很小的结构的细节 我们在会话中存储一个计数器i。在前3个请求中的每个请求中,我们都在dict中插入一个新的key:value对 在第三次和后续的重新加载请求中,下面的代码在elif会话['counter']['i']==2:condition上卡住。第三个永远也达不到。为什么? from flask import Flask, session, render_template_string ap

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

我们在会话中存储一个计数器i。在前3个请求中的每个请求中,我们都在dict中插入一个新的key:value对

在第三次和后续的重新加载请求中,下面的代码在elif会话['counter']['i']==2:condition上卡住。第三个永远也达不到。为什么?

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)

正如我们预期的那样打印5,但是view函数中类似的复合dict代码需要修改。

我发现当会话['counter']['I]==1时,会话不会更新会话['counter']的值。这就是为什么if子句在会话['counter']['i']==2时停止。我还不知道为什么,但当我通过重新分配会话['counter']的值来更新'I'时,您的代码会起作用:

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