如何在会话中弹出第二个值?

时间:2015-11-27 08:05:43

标签: python flask

我的登录系统有两个会话,' 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')

2 个答案:

答案 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')

它的执行速度比我的变量慢,而且更加冗长。

烧瓶中的

Sessionwrapper 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。