2016-09-17 58 views
0

我正在編寫一個python函數來驗證電子郵件中的令牌。在電子郵件中,有一個帶有端點的網址。我有兩個url參數,令牌和電子郵件地址。在我的終點我要檢查:在正常代碼中使用assert

  • 如果參數中的URL
  • 如果在數據庫
  • 一個關聯令牌,如果它對應於用戶的電子郵件
  • 如果令牌如果已經使用

我選擇包裝所有這些檢查在try except塊仍然有效(後2天到期)

  • ,I W生病總是返回相同的錯誤「無效的令牌」,所以我不必精確檢查個別錯誤。我使用了功能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 
    

    我喜歡我這樣做的方式,因爲它超級乾淨。 這是一個很好的做法嗎?這個問題還有其他解決方案嗎?

  • 回答

    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