Python本地和生产中`is`和`==`的不同行为

Bri*_*ian 0 python

我有一个正在运行的 Flask 应用程序,它一直在生产中产生一个奇怪的错误。对于路由,在返回结果之前,我会根据请求的资源检查用户的角色及其 ID。

在本地,我有以下行可以在开发服务器上运行并通过测试:

# user_id is a param passed to the Flask route
if current_user.usertype_id == 1 or current_user.id is user_id:
    # do something
else:
    abort(401)
Run Code Online (Sandbox Code Playgroud)

在生产中,即使用户已登录,每次都会抛出 401 错误。因此,我将其更改为仅检查相等性:

# user_id is a param passed to the Flask route
if current_user.usertype_id == 1 or current_user.id == user_id:
    # do something
else:
    abort(401)
Run Code Online (Sandbox Code Playgroud)

...这解决了未经授权的错误。

我明白之间的差别is==,所以我的问题是,为什么没有这个地方抛出一个错误?什么都没有改变,所以我希望测试能捕捉到这一点,但在单元测试中或当我在浏览器中手动测试时,没有任何失败。

pts*_*pts 5

您遇到不同行为的原因is是用户 ID 在本地很小,但在生产中很大。

要修复它,请按值比较整数与==.

这只是一个实现细节,对于小整数,is也返回 True:

assert int('5') is int('5')
assert not (int('555') is int('555'))
Run Code Online (Sandbox Code Playgroud)