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