【问题标题】:How should I handle different failure scenarios during Django authenticate()?在 Django authenticate() 期间我应该如何处理不同的失败场景?
【发布时间】:2015-05-13 19:45:50
【问题描述】:

我正在 Django 1.7 中编写自定义身份验证后端,它可能由于以下两个原因之一而失败:无效凭据或某种内部错误,例如数据库问题。根据失败情况,我想向用户提供不同的错误消息。 IE“用户名或密码不正确”的凭据无效,以及“发生错误,请重试或联系支持人员”之类的内容。

由于authenticate() 需要返回一个用户模型,我不能只返回错误,所以我想知道的是:将错误冒泡到名为authenticate() 的视图的最佳方法是什么?

我倾向于从authenticate() 抛出一个带有相应错误消息的异常,然后在视图中捕获该异常。我认为这是处理它的最佳方式,但是我与 Django 专家相差甚远,所以我很想听听社区的想法。

在这里抛出异常是我的最佳选择,还是有更好的方法将身份验证失败从authenticate() 冒泡到视图?如果抛出异常是我最好的选择,是否有一个预定义的 Django 异常符合要求,或者我应该自己制作?

【问题讨论】:

    标签: python django authentication django-views


    【解决方案1】:

    在自定义方法中,首先使用try except 可以捕获数据库错误

    在自定义方法中,用户对象将具有check_password 方法

    >>> try:
         user = User.objects.get(email='lennon@thebeatles.com')
    
        except:
            print("error with connection")
    

    然后使用check_password方法你会得到密码错误

        >>> user = User.objects.get(email='lennon@thebeatles.com')
        >>> user
        <User: john>
        >>> user.check_password('johnpassword')
        True
        >>> 
    

    【讨论】:

    • 我不关心如何正确捕获不同的故障点,我已经涵盖了。我想知道如何将错误冒泡到名为 authenticate() 的视图中。我现在意识到我并没有在问题中明确说明这一点,所以我重新措辞以使其更清楚。
    • 您可以做的最好的事情是在错误引发异常之前为错误生成验证器方法。或者应该生成错误并捕获引发的异常。
    【解决方案2】:

    我最终在视图中使用了 try/except 块,其中包含表示相关失败的自定义错误。

    【讨论】:

      猜你喜欢
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      相关资源
      最近更新 更多