mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-02-02 20:54:42 +03:00
Merge branch 'exception-handler-context' of git://github.com/jpadilla/django-rest-framework into jpadilla-exception-handler-context
This commit is contained in:
commit
d22c0007b3
|
@ -51,10 +51,10 @@ In order to alter the style of the response, you could write the following custo
|
||||||
|
|
||||||
from rest_framework.views import exception_handler
|
from rest_framework.views import exception_handler
|
||||||
|
|
||||||
def custom_exception_handler(exc):
|
def custom_exception_handler(exc, context):
|
||||||
# Call REST framework's default exception handler first,
|
# Call REST framework's default exception handler first,
|
||||||
# to get the standard error response.
|
# to get the standard error response.
|
||||||
response = exception_handler(exc)
|
response = exception_handler(exc, context)
|
||||||
|
|
||||||
# Now add the HTTP status code to the response.
|
# Now add the HTTP status code to the response.
|
||||||
if response is not None:
|
if response is not None:
|
||||||
|
|
|
@ -393,7 +393,7 @@ This setting can be changed to support error responses other than the default `{
|
||||||
|
|
||||||
This should be a function with the following signature:
|
This should be a function with the following signature:
|
||||||
|
|
||||||
exception_handler(exc)
|
exception_handler(exc, context)
|
||||||
|
|
||||||
* `exc`: The exception.
|
* `exc`: The exception.
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
Provides an APIView class that is the base of all views in REST framework.
|
Provides an APIView class that is the base of all views in REST framework.
|
||||||
"""
|
"""
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
import inspect
|
||||||
|
import warnings
|
||||||
|
|
||||||
from django.core.exceptions import PermissionDenied
|
from django.core.exceptions import PermissionDenied
|
||||||
from django.http import Http404
|
from django.http import Http404
|
||||||
|
@ -46,7 +48,7 @@ def get_view_description(view_cls, html=False):
|
||||||
return description
|
return description
|
||||||
|
|
||||||
|
|
||||||
def exception_handler(exc):
|
def exception_handler(exc, context):
|
||||||
"""
|
"""
|
||||||
Returns the response that should be used for any given exception.
|
Returns the response that should be used for any given exception.
|
||||||
|
|
||||||
|
@ -184,6 +186,18 @@ class APIView(View):
|
||||||
'request': getattr(self, 'request', None)
|
'request': getattr(self, 'request', None)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def get_exception_handler_context(self):
|
||||||
|
"""
|
||||||
|
Returns a dict that is passed through to EXCEPTION_HANDLER,
|
||||||
|
as the `context` argument.
|
||||||
|
"""
|
||||||
|
return {
|
||||||
|
'view': self,
|
||||||
|
'args': getattr(self, 'args', ()),
|
||||||
|
'kwargs': getattr(self, 'kwargs', {}),
|
||||||
|
'request': getattr(self, 'request', None)
|
||||||
|
}
|
||||||
|
|
||||||
def get_view_name(self):
|
def get_view_name(self):
|
||||||
"""
|
"""
|
||||||
Return the view name, as used in OPTIONS responses and in the
|
Return the view name, as used in OPTIONS responses and in the
|
||||||
|
@ -369,7 +383,18 @@ class APIView(View):
|
||||||
else:
|
else:
|
||||||
exc.status_code = status.HTTP_403_FORBIDDEN
|
exc.status_code = status.HTTP_403_FORBIDDEN
|
||||||
|
|
||||||
response = self.settings.EXCEPTION_HANDLER(exc)
|
exception_handler = self.settings.EXCEPTION_HANDLER
|
||||||
|
|
||||||
|
if len(inspect.getargspec(exception_handler).args) == 1:
|
||||||
|
warnings.warn(
|
||||||
|
'The `exception_handler(exc)` call signature is deprecated. '
|
||||||
|
'Use `exception_handler(exc, context) instead.',
|
||||||
|
PendingDeprecationWarning
|
||||||
|
)
|
||||||
|
response = exception_handler(exc)
|
||||||
|
else:
|
||||||
|
context = self.get_exception_handler_context()
|
||||||
|
response = exception_handler(exc, context)
|
||||||
|
|
||||||
if response is None:
|
if response is None:
|
||||||
raise
|
raise
|
||||||
|
|
Loading…
Reference in New Issue
Block a user