为什么django哈希器正在使用assert?

时间:2019-09-16 15:11:08

标签: python django django-authentication

我对散列的Django实现有疑问。它们全部实现verify方法,并且正在执行assert algorithm == self.algorithm

我知道可以通过将标志-O传递给生产代码上的Python解释器来禁用断言。

例如,BCryptSHA256PasswordHasher像这样实现verify

def verify(self, password, encoded):
    algorithm, salt, hash = encoded.split('$', 2)
    assert algorithm == self.algorithm
    encoded_2 = self.encode(password, salt)
    return constant_time_compare(encoded, encoded_2)

assert语句仅在开发阶段使用吗?还是有其他原因?

2 个答案:

答案 0 :(得分:1)

多年来,我也逐渐在代码中添加断言,与此类似。

以这种方式使用时,使您的代码引发AssertionError而不是某些副作用(导致无法满足预期条件)会加快调试速度。

我个人认为这些asserts不会投入生产,但这是根据个人用例以及代码的使用,维护方式等做出的选择。< / p>

答案 1 :(得分:0)

asserts不应在生产中使用,取决于代码是否针对生产进行了优化。

断言从pyo文件中剥离了一些结果是测试的代码未部署(如果已优化)。这可能会使开发人员没有意识到谁正在使用断言来引发并阻止开发中的进一步执行以保护上游调用。这在生产中将不受保护。