如果我们在此处查看 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
的重点?
不应该像这样使用try
和except
:
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
使用上述方法,不会产生错误,对吗?
答案 0 :(得分:1)
Python评估" boolean"表达式从左到右开始,如果任何条件失败并在False
或True
中转换整个表达式,python将停止评估并返回值。
因此,如果request.user
为None
,则整个表达式为False
,则python返回False
并跳过request.user.is_authenticated()
评估。所以,你不会得到"属性错误"异常。
注意:
如果request
对象没有user
属性,则会出现属性错误,但该步骤上的request
对象始终具有对象或None
。但是,并不总是该对象具有is_authenticated()
方法。
此外,该方法命名为" has_permission",因此,最好返回boolean
说明当前用户是否存在它是否有权提出异常。另外,使用try / except块,您如何确定引发的异常是因为request.user
不存在?即使你发现了正确的异常,你也需要至少6行代表1。
也在python中
1 and 2 == True
即使1
和2
不是"booleans"
。因此,如果request.user
不是" boolean"则无关紧要,它将检查request.user
是否存在且不是None
。