我的登录系统有两个会话,' admin'和'标准',我正在弹出' admin'当我点击退出时关闭会话堆栈,我想知道我如何弹出标准会话?
# Logout of System
@app.route('/logout')
def logout():
session.pop('is_admin')
#session.pop('standard')
return render_template('/index.html')
我尝试的另一种变体,它不起作用
# Logout of System
@app.route('/logout')
def logout():
if 'is_admin' in session:
session.pop('is_admin')
return render_template('/index.html')
if 'is_standard' in session:
session.pop('standard')
return render_template('/index.html')
答案 0 :(得分:2)
你为什么不试试这个:
@app.route('/logout')
def logout():
for s in ['is_admin', 'standard']:
try:
session.pop(s)
except KeyError:
continue
return render_template('/index.html')
如果它们存在,上面将弹出两个键,或者仅存在那个键。 如果您从sobolevn的答案中加入列表理解,那么这就是您的路线的样子
@app.route('/logout')
def logout():
[session.pop(i, None) for i in ['is_admin', 'standard']]
return render_template('/index.html')
你的第二个变种应该是:
# Logout of System
@app.route('/logout')
def logout():
if 'is_admin' in session:
session.pop('is_admin')
return render_template('/index.html')
if 'is_standard' in session:
session.pop('standard')
return render_template('/index.html')
它的执行速度比我的变量慢,而且更加冗长。
烧瓶中的 Session
是wrapper around dictionary。这就是为什么你不能迭代会话,并从中删除元素:
In [35]: session = {'std': 'bar', 'admin':'foo', 'manager': 'baz'}
In [36]: for s in session:
try:
session.pop(s)
except KeyError:
continue
....:
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-36-14e9c7f174be> in <module>()
----> 1 for s in session:
2 try:
3 session.pop(s)
4 except KeyError:
5 continue
RuntimeError: dictionary changed size during iteration
这向您展示了它对两个键的工作原理:
In [37]: session = {'std': 'bar', 'admin':'foo', 'manager': 'baz'}
In [38]: for s in ['std', 'admin']:
try:
session.pop(s)
except KeyError:
continue
....:
In [39]: print session
{'manager': 'baz'}
会话修改完毕后,您将获得以下内容:
In [41]: for s in ['std', 'admin']:
try:
session.pop(s)
except KeyError:
print "I didn't find %s" % s
continue
....:
I didn't find std
I didn't find admin
我希望这能使我的回答清楚。
答案 1 :(得分:1)
好的,这是一个单行:
>>> s = {'is_admin': 1, 'standard': 1}
>>> [s.pop(i, None) for i in ['is_admin', 'standard']]
[1, 1]
>>> s
{}
pop(键[,默认])
如果key在字典中,则删除它并返回其值,否则 返回默认值。如果未给出默认值且密钥不在 字典,引发了KeyError。