为什么在IsAuthenticated的DRF源代码中,当request.user不是布尔值时,它返回`request.user和request.user.is_authenticated()`?

时间:2015-11-13 00:21:37

标签: python django django-rest-framework

如果我们在此处查看 DRF 源代码:https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/permissions.py#L40,这是IsAuthenticated的代码:

class IsAuthenticated(BasePermission):
    """
    Allows access only to authenticated users.
    """

    def has_permission(self, request, view):
        return request.user and request.user.is_authenticated()

我只是想知道return request.user部分的作用,因为request.user是用户对象,而不是布尔值。因此,如果request没有user,则会引发属性错误,对吗?但是,如果我们遗漏了return request.user部分而只是return request.user.is_authenticated(),那么如果request没有user,则仍然会引发属性错误,那么'是在开头添加return request.user的重点?

不应该像这样使用tryexcept

class IsAuthenticated(BasePermission):
    """
    Allows access only to authenticated users.
    """

def has_permission(self, request, view):
    try:
        return request.user.is_authenticated()
    except:
        # If the above raises an error (meaning user is not part of request),
        # then deny permission by returning False.
        return False

使用上述方法,不会产生错误,对吗?

1 个答案:

答案 0 :(得分:1)

Python评估" boolean"表达式从左到右开始,如果任何条件失败并在FalseTrue中转换整个表达式,python将停止评估并返回值。

因此,如果request.userNone,则整个表达式为False,则python返回False并跳过request.user.is_authenticated()评估。所以,你不会得到"属性错误"异常。

注意: 如果request对象没有user属性,则会出现属性错误,但该步骤上的request对象始终具有对象或None。但是,并不总是该对象具有is_authenticated()方法。

此行为称为short-circuit-evaluation

此外,该方法命名为" has_permission",因此,最好返回boolean说明当前用户是否存在它是否有权提出异常。另外,使用try / except块,您如何确定引发的异常是因为request.user不存在?即使你发现了正确的异常,你也需要至少6行代表1。

也在python中

1 and 2 == True

即使12不是"booleans"。因此,如果request.user不是" boolean"则无关紧要,它将检查request.user是否存在且不是None