我在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
它也会中止
答案 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'
...
希望有所帮助