Skip to content

Commit 6968828

Browse files
committed
Ensure Django{Model,Object}Permissions don't hide exceptions.
Quietly catching `AttributeError` and `TypeError` when calling `get_queryset()` is rather insidious, as those exceptions get caught no matter where they might happen in the call stack.
1 parent 200dda9 commit 6968828

File tree

1 file changed

+8
-8
lines changed

1 file changed

+8
-8
lines changed

rest_framework/permissions.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -112,15 +112,15 @@ def has_permission(self, request, view):
112112
if getattr(view, '_ignore_model_permissions', False):
113113
return True
114114

115-
try:
115+
if hasattr(view, 'get_queryset'):
116116
queryset = view.get_queryset()
117-
except AttributeError:
117+
else:
118118
queryset = getattr(view, 'queryset', None)
119119

120120
assert queryset is not None, (
121121
'Cannot apply DjangoModelPermissions on a view that '
122-
'does not have `.queryset` property or overrides the '
123-
'`.get_queryset()` method.')
122+
'does not set `.queryset` or have a `.get_queryset()` method.'
123+
)
124124

125125
perms = self.get_required_permissions(request.method, queryset.model)
126126

@@ -169,15 +169,15 @@ def get_required_object_permissions(self, method, model_cls):
169169
return [perm % kwargs for perm in self.perms_map[method]]
170170

171171
def has_object_permission(self, request, view, obj):
172-
try:
172+
if hasattr(view, 'get_queryset'):
173173
queryset = view.get_queryset()
174-
except AttributeError:
174+
else:
175175
queryset = getattr(view, 'queryset', None)
176176

177177
assert queryset is not None, (
178178
'Cannot apply DjangoObjectPermissions on a view that '
179-
'does not have `.queryset` property or overrides the '
180-
'`.get_queryset()` method.')
179+
'does not set `.queryset` or have a `.get_queryset()` method.'
180+
)
181181

182182
model_cls = queryset.model
183183
user = request.user

0 commit comments

Comments
 (0)