2016-09-17 5 views
0

Я пишу функцию python для проверки токена из электронной почты. В электронном письме есть URL-адрес с его конечной точкой. У меня есть два параметра URL, токен и адрес электронной почты. В моей конечной точке я должен проверить:Использовать assert в нормальном коде

  • если параметры в URL
  • если есть ассоциированный маркер в базе данных
  • , если она соответствует электронной почте пользователя
  • если маркер остается в силе (истекает через 2 дня)
  • , если она уже была использована

Я выбираю, чтобы обернуть все эти проверки в try except блоке, я ж ill всегда возвращают ту же ошибку «недопустимый токен», поэтому мне не нужно точно проверять индивидуальную ошибку. Я использовал функцию 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 

Мне нравится, как я это делал, потому что это супер чистый. Это хорошая практика? Есть ли другое решение для этой проблемы?

ответ

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.