我正在编写一个python函数来验证来自电子邮件的令牌.在电子邮件中,有一个带有端点的URL.我有两个url参数,即令牌和电子邮件地址.在我的端点我必须检查:
我选择将所有这些检查包装在一个try except块中,我将始终返回相同的错误"无效令牌",因此我不必精确检查个别错误.我使用了该函数assertFalse,assertEqual如果它不正确,将引发异常.
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
Run Code Online (Sandbox Code Playgroud)
我喜欢我这样做的方式,因为它非常干净.这是一个好习惯吗?这个问题有其他解决方案吗?
不,使用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
Run Code Online (Sandbox Code Playgroud)
如果你绝对坚持由引发错误(这在某些情况下,做有效的事)控制程序的流程,这样做有raise,例如if condition: raise TypeError.