Django rest framework 如何实现以正确格式呈现响应内容的自定义服务器错误?

Django rest framework 如何实现以正确格式呈现响应内容的自定义服务器错误?,django-rest-framework,Django Rest Framework,我有一个自定义的server_error函数,可以使用DRF返回500错误的json响应: def api_server_error(request, template_name=None): return HttpResponseServerError(json.dumps({'detail': 'Internal server error'}), content_type="application/json",

我有一个自定义的server_error函数,可以使用DRF返回500错误的json响应:

def api_server_error(request, template_name=None):

    return HttpResponseServerError(json.dumps({'detail': 'Internal server error'}),
                                   content_type="application/json", status=500)

但我真正想做的是以请求的格式呈现响应,例如xml、json等。我如何做到这一点?

通过返回drf响应:

from rest_framework.response import Response from rest_framework import status return Response({'detail' : "Internal server error"}, status = status.HTTP_500_INTERNAL_SERVER_ERROR) 来自rest\u framework.response导入响应 从rest\u框架导入状态 返回响应({'detail':“internalserver error”},status=status.HTTP\u 500\u Internal\u server\u error)
好的,多亏@djangozone让我朝着正确的方向开始,我想出了一个解决方案。我的问题开始是因为我假设因为服务器错误被称为DRF之外的错误,这将限制我使用DRF特性来提供正确格式的响应的能力。为了让DRF正确地渲染它,还有一些工作要做。这是:

from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.settings import api_settings
from rest_framework import status
import re

def get_format_suffix(request):

    suffix_pattern = r'\.([a-z0-9]+)$'
    match = re.search(suffix_pattern, request.path)
    format = match and match.group(1)

    return format

def api_server_error(request, template_name=None):

    drf_request = Request(request)
    format_suffix = get_format_suffix(drf_request)
    accepted_renderer = drf_request.negotiator.select_renderer(
        drf_request, [renderer() for renderer in api_settings.DEFAULT_RENDERER_CLASSES], format_suffix=format_suffix
    )

    response = Response({'detail' : "Internal server error"}, status = status.HTTP_500_INTERNAL_SERVER_ERROR)
    response.accepted_renderer = accepted_renderer[0]
    response.accepted_media_type = response.accepted_renderer.media_type
    response.renderer_context = {'request': drf_request}
    response.render()

    return response

谢谢你让我从正确的方向开始。请参阅下面的完整解决方案。哈哈,我以为默认情况下它会这样工作。如果您查看rest_framework源代码,在文件mixings.py中,all方法总是返回一个响应,而不执行您正在执行的所有操作(当您使用.xml、.json等Ofc请求特定的渲染方法时,它会起作用,您需要在设置或视图中指定渲染器类)。我不知道是否有更好的方法来实现这一点,也不知道rest\u框架在哪里实现了这一点。问题是我编写的额外代码是视图在幕后实际执行的操作,而server\u错误在视图之外操作。因为我们没有在这里进行工作,所以我不得不复制相关部分。啊,好的。当我有时间的时候,我也会去探索它。很高兴它现在起作用了。