在普通代码

时间:2016-09-17 00:04:31

标签: python assert

我正在编写一个python函数来验证来自电子邮件的令牌。在电子邮件中,有一个带有端点的URL。我有两个url参数,即令牌和电子邮件地址。在我的终端中,我必须检查:

  • 如果参数在URL中
  • 如果数据库中有关联令牌
  • 如果它对应于用户电子邮件
  • 如果令牌仍然有效(2天后过期)
  • 如果已经使用

我选择将所有这些检查包装在try except块中,我将始终返回相同的错误“无效令牌”,因此我不必精确检查个别错误。我使用了函数assertFalseassertEqual,如果它不正确会引发异常。

try:
    # pull from url
    email = request.GET['email']
    value_token = request.GET['token']
    # test if valid
    token = EmailValidationToken.objects.get(token=value_token)
    assertFalse(token.consumed)
    assertEqual(email, token.user.email)
    assertFalse(token.is_expired())
except:
    pass # return error

我喜欢我这样做的方式,因为它非常干净。 这是一个好习惯吗?这个问题还有其他解决办法吗?

1 个答案:

答案 0 :(得分:5)

不,使用assert进行控制流而不是调试是不好的做法,因为可以关闭断言。只需使用普通的if语句。

# pull from url
email = request.GET['email']
value_token = request.GET['token']
# test if valid
token = EmailValidationToken.objects.get(token=value_token)
if token.consumed or email != token.user.email or token.is_expired():
    pass # return error

如果您绝对坚持通过引发错误来控制程序的流程(在某些情况下这是有效的事情),请使用raise执行此操作,例如: if condition: raise TypeError