捕获受保护的错误并向用户显示其消息,而不是裸500代码

时间:2017-05-28 16:49:46

标签: django

Django 1.11

我正在制作照片档案。通过AJAX我向帧添加一些信息(评论,注释,地点等)。

但现在我想组织删除框架。

这似乎是我设法找到的相关问题:Handle PROTECT ERROR in Django DeleteView

我需要告知用户:你正试图从其他物体的脚下割草。

Berislav Lopac在上述链接上的回答似乎是合理的。

现在在生产服务器上我得到了这个:

服务器错误(500)

在调试模式下,我可以看到ProtectedError。

你能帮我理解如何在生产中向用户展示有意义的信息吗?只需捕获ProtectedError消息并显示它而不是服务器错误(500)。

模型

class Frame(models.Model):

    type = models.CharField(max_length=10,
                            blank=False,
                            null=False,
                            default="---",
                            verbose_name=_('type'))


class FramePlace(CommonUrlMethodsMixin,
                models.Model
                ):

    frame = models.ForeignKey(Frame,
                              blank=False,
                              on_delete=models.PROTECT,
                              verbose_name=_("frame"))

    place = models.ForeignKey(Place,
                              blank=False,
                              on_delete=models.PROTECT,
                              verbose_name=_("place"))

2 个答案:

答案 0 :(得分:4)

有两种方法可以实现这个目标

  1. 覆盖所需ViewSet的perform_destroydestroy方法
  2. 添加中间件以处理来自所有ViewSet的异常
  3. 1 - ViewSet级别(特定)

    class MyViewSet(viewsets.ModelViewSet):
        def perform_destroy(self, instance):
            try:
                return super(MyViewSet, self).perform_destroy(instance)
            except ProtectedError as exception:
                data = {
                    'code': 'server_error',
                    'message': _('Internal server error.'),
                    'error': {
                        'type': str(type(exception)),
                        'message': str(exception)
                    }
                }
                return JsonResponse(data=data, status=status.HTTP_400_BAD_REQUEST)
    

    2 - 申请级别(一般)

    <强> middleware.py

    class ExceptionMiddleware(object):
        """
        Middleware that makes sure clients see a meaningful error message wrapped in a Json response.
        """    
        def __init__(self, get_response):
            self.get_response = get_response
    
        def __call__(self, request):
            response = self.get_response(request)
            return response
    
        def process_exception(self, request, exception):
            data = {
                'code': 'server_error',
                'message': _('Internal server error.'),
                'error': {
                    'type': str(type(exception)),
                    'message': str(exception)
                }
            }
            return JsonResponse(data=data, status=status.HTTP_400_BAD_REQUEST)
    

    <强> settings.py

    MIDDLEWARE = [
        ...
        'myapp.middleware.ExceptionMiddleware'
    ]
    

答案 1 :(得分:0)

针对此问题。我正在使用下面的代码。希望这会有所帮助。

在这里,捕获下面的ProtectedError代码是有效的。

from django.db.models import ProtectedError

def delete(self, request):
    obj = self.get_object()
    try:
        obj.delete()
        return JsonResponse( {"error":""} )

    except ProtectedError as e:
        return JsonResponse( {"error":"somae relation exists"} )

    except Exception as e:
        return JsonResponse( {"error":"something went wrong"} )
  

希望这对您有用。