Python 烧瓶2会话中止

Python 烧瓶2会话中止,python,flask,Python,Flask,我在Flask中有2种会话模式 1. '管理员 2. '正常的 此代码 if 'admin' not in session: abort(404) 工作。。。但是,如果我“或教唆”了这两个课程: if 'admin' or 'normal' not in session: abort(404) 两个都中止。我也试过了 if 'admin' not in session or 'normal' not in session: abort(404) 它也会中止尝试使用任

我在Flask中有2种会话模式 1. '管理员 2. '正常的

此代码

if 'admin' not in session:
    abort(404)
工作。。。但是,如果我“或教唆”了这两个课程:

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

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

它也会中止

尝试使用
任何

if not any(mode in session for mode in ('admin', 'normal')):
    abort(404)
我假设“有效”与“不有效”是指:

因此,从您的示例中:

例1:

If 'admin' not in session:
如果此操作未中止,则“管理员不在会话中”为False。它在会话字典中查找密钥“admin”,并找到它。会话中有一个名为“admin”的密钥。“not”否定了这一点,因此您不会中止

例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的逻辑“or”类似于“计算第一个术语,如果计算结果为True,则返回它,否则返回第二个术语”

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

'normal' not in session
为True,因此,如果它被中止,则可以断定会话中没有键“正常”

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

你把会话对象看作一个集合,但它基本上只是一个DICT。如果你有多个模式,你应该考虑使用一个称为“模式”的键,然后将当前模式存储为该键的值。

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

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


希望这有帮助。这真的帮助了我。Thaaanks!太好了,很高兴这有帮助。祝你好运。顺便问一下,这对回答你的问题有帮助吗?如果是这样,您可以随时接受…;-)
'normal' not in session
if session['mode'] == 'admin'
    ...
if session['mode'] == 'normal'
    ...