首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django REST异常

Django REST异常
EN

Stack Overflow用户
提问于 2015-05-29 19:12:31
回答 2查看 30.6K关注 0票数 32

我目前有一些基于Django REST框架的视图代码。我一直在使用customer exception类,但理想情况下,我希望使用内置的Django REST异常。

从下面的代码中,我觉得这可能不是最好或最干净的方式来最大限度地利用REST框架异常。

有没有人有什么好的例子,他们捕捉问题并干净地返回它们,其余的都内置在异常中?

代码语言:javascript
复制
class JSONResponse(HttpResponse):
    def __init__(self, data, **kwargs):
       content = JSONRenderer().render(data)
       kwargs['content_type'] = 'application/json'
       super(JSONResponse, self).__init__(content, **kwargs)

def queryInput(request):
    try:
        auth_token = session_id = getAuthHeader(request)
        if not auth_token:
            return JSONResponse({'detail' : "fail", "error" : "No X-Auth-Token Found", "data" : None}, status=500)

        if request.method:
            data = JSONParser().parse(request)
            serializer = queryInputSerializer(data=data)

        if request.method == 'POST':
            if serializer.is_valid():
                input= serializer.data["input"]
                fetchData = MainRunner(input=input,auth_token=auth_token)
                main_data = fetchData.main()

            if main_data:
                return JSONResponse({'detail' : "success", "error" : None, "data" : main_data}, status=201)

        return JSONResponse({'detail' : "Unknown Error","error" : True, "data" : None}, status=500)

    except Exception as e:
           return JSONResponse({'error' : str(e)},status=500)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-04 02:38:40

Django REST框架提供了几个built in exceptions,它们大多是DRF的APIException的子类。

您可以像在Python中一样在视图中引发异常:

代码语言:javascript
复制
from rest_framework.exceptions import APIException

def my_view(request):
    raise APIException("There was a problem!")

您还可以通过继承APIException并设置status_codedefault_detail来创建自己的自定义异常。其中内置的有:ParseErrorAuthenticationFailedNotAuthenticatedPermissionDeniedNotFoundNotAcceptableValidationError等。

然后,REST框架的异常处理程序会将它们转换为Response。每个异常都与添加到Response中的状态代码相关联。默认情况下,异常处理程序设置为内置处理程序:

代码语言:javascript
复制
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler'
}

但是,如果您希望通过在settings.py文件中更改以下内容来自己转换异常,则可以将其设置为您自己的自定义异常处理程序:

代码语言:javascript
复制
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
}

然后在该位置创建自定义处理程序:

代码语言:javascript
复制
from rest_framework.views import exception_handler

def custom_exception_handler(exc, context):
    # Call REST framework's default exception handler first,
    # to get the standard error response.
    response = exception_handler(exc, context)

    # Now add the HTTP status code to the response.
    if response is not None:
        response.data['status_code'] = response.status_code

    return response
票数 70
EN

Stack Overflow用户

发布于 2015-05-29 19:43:57

您可以使用build in DRF exception,只需导入和提升

代码语言:javascript
复制
from rest_framework.exceptions import
...
raise ParseError('I already have a status code!')
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30528088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档