烧瓶2次会议中止

时间:2017-02-19 12:21:00

标签: python flask

我在Flask中有2种会话模式 1.' admin' 2.'正常'

此代码

if 'admin' or 'normal' not in session:
    abort(404)

有效...但如果我" or-ed"两个会议:

if 'admin' not in session or 'normal' not in session:
    abort(404)
两个都中止了。我也试过

getBoundsInScreen

它也会中止

2 个答案:

答案 0 :(得分:0)

尝试使用any

if not any(mode in session for mode in ('admin', 'normal')):
    abort(404)

答案 1 :(得分:0)

我认为“工作”与“不工作”意味着:

"works" == "doesn't abort"

"not works" == "aborts"

所以,从你的例子中可以看出:

示例1:

If 'admin' not in session:

如果没有中止,则“admin not in session”为False。它在会话字典中查找键“admin”并找到它。您在会话中有一个名为“admin”的密钥。 “不”否定了这一点,所以你不要中止。

示例2:

If 'admin' or 'normal' not in session

这里发生的是

If 'admin' or 'normal'

计算结果为True,因此该表达式实际上在会话中查找True(布尔)键。您表明这会中止,这意味着您必须在某些时候为True键分配一个值。

这有点奇怪(没有冒犯),所以代码中某处的逻辑肯定存在问题。

示例3:

if 'admin' not in session or 'normal' not in session

Python的逻辑“或”的作用类似于“评估第一个术语,然后如果评估为True则返回它,否则返回第二个术语”

第一个术语只是示例1(我们确定评估为False),因此如果它中止,它必须将第二个术语评估为True。换句话说,

'normal' not in session

是正确的,因此如果它中止,您可以断定会话中没有关键的“正常”。

现在,将模式存储为键将允许同时应用多种模式,这可能不是您想要的。

您似乎将会话对象视为一个集合,但它基本上只是一个字典。如果您有多种模式,则应考虑使用名为“mode”的单个键,然后将当前模式存储为该键的值。

然后你可以使用简单的逻辑,如:

if session['mode'] == 'admin'
    ...

if session['mode'] == 'normal'
    ...

希望有所帮助

相关问题