Commit d232c573 by Tom Christie

Merge branch 'exception-handler-context' of…

Merge branch 'exception-handler-context' of git://github.com/jpadilla/django-rest-framework into version-3.1
parents 4778463e 4ebd8770
...@@ -51,10 +51,10 @@ In order to alter the style of the response, you could write the following custo ...@@ -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 `{ ...@@ -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 @@ ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment