mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-10-31 07:57:55 +03:00 
			
		
		
		
	Removing 403 immediate response
This commit is contained in:
		
							parent
							
								
									26831df88e
								
							
						
					
					
						commit
						1c28562397
					
				|  | @ -1,3 +1,22 @@ | ||||||
|  | from djangorestframework import status | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class ParseError(Exception): | class ParseError(Exception): | ||||||
|     def __init__(self, detail): |     status_code = status.HTTP_400_BAD_REQUEST | ||||||
|         self.detail = detail |     default_detail = 'Malformed request' | ||||||
|  | 
 | ||||||
|  |     def __init__(self, detail=None): | ||||||
|  |         self.detail = detail or self.default_detail | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class PermissionDenied(Exception): | ||||||
|  |     status_code = status.HTTP_403_FORBIDDEN | ||||||
|  |     default_detail = 'You do not have permission to access this resource.' | ||||||
|  | 
 | ||||||
|  |     def __init__(self, detail=None): | ||||||
|  |         self.detail = detail or self.default_detail | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # class Throttled(Exception): | ||||||
|  | #     def __init__(self, detail): | ||||||
|  | #         self.detail = detail | ||||||
|  |  | ||||||
|  | @ -7,6 +7,7 @@ Permission behavior is provided by mixing the :class:`mixins.PermissionsMixin` c | ||||||
| 
 | 
 | ||||||
| from django.core.cache import cache | from django.core.cache import cache | ||||||
| from djangorestframework import status | from djangorestframework import status | ||||||
|  | from djangorestframework.exceptions import PermissionDenied | ||||||
| from djangorestframework.response import ImmediateResponse | from djangorestframework.response import ImmediateResponse | ||||||
| import time | import time | ||||||
| 
 | 
 | ||||||
|  | @ -23,11 +24,6 @@ __all__ = ( | ||||||
| SAFE_METHODS = ['GET', 'HEAD', 'OPTIONS'] | SAFE_METHODS = ['GET', 'HEAD', 'OPTIONS'] | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| _403_FORBIDDEN_RESPONSE = ImmediateResponse( |  | ||||||
|     {'detail': 'You do not have permission to access this resource. ' + |  | ||||||
|                'You may need to login or otherwise authenticate the request.'}, |  | ||||||
|     status=status.HTTP_403_FORBIDDEN) |  | ||||||
| 
 |  | ||||||
| _503_SERVICE_UNAVAILABLE = ImmediateResponse( | _503_SERVICE_UNAVAILABLE = ImmediateResponse( | ||||||
|     {'detail': 'request was throttled'}, |     {'detail': 'request was throttled'}, | ||||||
|     status=status.HTTP_503_SERVICE_UNAVAILABLE) |     status=status.HTTP_503_SERVICE_UNAVAILABLE) | ||||||
|  | @ -66,7 +62,7 @@ class IsAuthenticated(BasePermission): | ||||||
| 
 | 
 | ||||||
|     def check_permission(self, user): |     def check_permission(self, user): | ||||||
|         if not user.is_authenticated(): |         if not user.is_authenticated(): | ||||||
|             raise _403_FORBIDDEN_RESPONSE |             raise PermissionDenied() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class IsAdminUser(BasePermission): | class IsAdminUser(BasePermission): | ||||||
|  | @ -76,7 +72,7 @@ class IsAdminUser(BasePermission): | ||||||
| 
 | 
 | ||||||
|     def check_permission(self, user): |     def check_permission(self, user): | ||||||
|         if not user.is_staff: |         if not user.is_staff: | ||||||
|             raise _403_FORBIDDEN_RESPONSE |             raise PermissionDenied() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class IsUserOrIsAnonReadOnly(BasePermission): | class IsUserOrIsAnonReadOnly(BasePermission): | ||||||
|  | @ -87,7 +83,7 @@ class IsUserOrIsAnonReadOnly(BasePermission): | ||||||
|     def check_permission(self, user): |     def check_permission(self, user): | ||||||
|         if (not user.is_authenticated() and |         if (not user.is_authenticated() and | ||||||
|             self.view.method not in SAFE_METHODS): |             self.view.method not in SAFE_METHODS): | ||||||
|             raise _403_FORBIDDEN_RESPONSE |             raise PermissionDenied() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class DjangoModelPermissions(BasePermission): | class DjangoModelPermissions(BasePermission): | ||||||
|  | @ -123,10 +119,7 @@ class DjangoModelPermissions(BasePermission): | ||||||
|             'app_label': model_cls._meta.app_label, |             'app_label': model_cls._meta.app_label, | ||||||
|             'model_name':  model_cls._meta.module_name |             'model_name':  model_cls._meta.module_name | ||||||
|         } |         } | ||||||
|         try: |  | ||||||
|         return [perm % kwargs for perm in self.perms_map[method]] |         return [perm % kwargs for perm in self.perms_map[method]] | ||||||
|         except KeyError: |  | ||||||
|             ImmediateResponse(status.HTTP_405_METHOD_NOT_ALLOWED) |  | ||||||
| 
 | 
 | ||||||
|     def check_permission(self, user): |     def check_permission(self, user): | ||||||
|         method = self.view.method |         method = self.view.method | ||||||
|  | @ -134,7 +127,7 @@ class DjangoModelPermissions(BasePermission): | ||||||
|         perms = self.get_required_permissions(method, model_cls) |         perms = self.get_required_permissions(method, model_cls) | ||||||
| 
 | 
 | ||||||
|         if not user.is_authenticated or not user.has_perms(perms): |         if not user.is_authenticated or not user.has_perms(perms): | ||||||
|             raise _403_FORBIDDEN_RESPONSE |             raise PermissionDenied() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class BaseThrottle(BasePermission): | class BaseThrottle(BasePermission): | ||||||
|  |  | ||||||
|  | @ -249,8 +249,8 @@ class View(DjangoView): | ||||||
| 
 | 
 | ||||||
|         except ImmediateResponse, exc: |         except ImmediateResponse, exc: | ||||||
|             response = exc.response |             response = exc.response | ||||||
|         except exceptions.ParseError as exc: |         except (exceptions.ParseError, exceptions.PermissionDenied) as exc: | ||||||
|             response = Response({'detail': exc.detail}, status=status.HTTP_400_BAD_REQUEST) |             response = Response({'detail': exc.detail}, status=exc.status_code) | ||||||
| 
 | 
 | ||||||
|         self.response = self.final(request, response, *args, **kwargs) |         self.response = self.final(request, response, *args, **kwargs) | ||||||
|         return self.response |         return self.response | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user