[英]Django Rest Framework how to return detail not found on all invalid urls?
[英]How to modify error response in ModelViewSet class if detail not found for Django REST Framework?
我試圖實現這個答案,為我所有的ModelViewSet
類創建一個自定義基礎Response
class。 我的問題是retrieve
function。如果找不到我要查找的實例Id
,我似乎無法使用修改后的Response
更改response_format
。 它仍然給出默認響應。 我應該將if
條件更改為什么?
views.py
:
class ResponseInfo(object):
def __init__(self, **args):
self.response = {
"message": args.get('message', 'success'),
"error": args.get('error', ),
"data": args.get('data', []),
}
class LanguageView(viewsets.ModelViewSet):
def __init__(self, **kwargs):
self.response_format = ResponseInfo().response
super(LanguageView, self).__init__(**kwargs)
permission_classes = [permissions.DjangoModelPermissions]
queryset = Language.objects.all()
serializer_class = LanguageSerializer
def list(self, request, *args, **kwargs):
# call the original 'list' to get the original response.
response_data = super(LanguageView, self).list(request, *args, **kwargs)
# customize the response data.
self.response_format['data'] = response_data.data
if not response_data.data:
self.response_format['message'] = 'List is empty.'
self.response_format['error'] = response_data.status_code
return Response(self.response_format)
def retrieve(self, request, *args, **kwargs):
response_data = super(LanguageView, self).retrieve(request, *args, **kwargs)
self.response_format['data'] = response_data.data
if not response_data.data:
self.response_format['message'] = 'Instance not found.'
self.response_format['error'] = response_data.status_code
return Response(self.response_format)
找到實例時的 JSON 響應。 例如http://127.0.0.1:8000/languages/1/ :
{
"message": "success",
"error": null,
"data": {
"id": 1,
"name": "English",
"icon": "http://127.0.0.1:8000/media/language_icons/English.png",
"xml": "http://127.0.0.1:8000/media/-",
"abbreviation": "En"
}
}
找不到實例時的 JSON 響應。 例如 URL: http://127.0.0.1:8000/languages/4/ :
{
"detail": "Not found."
}
我希望得到的回應:
{
"message": "Instance not found.",
"error": "HTTP_404_NOT_FOUND",
}
是否可以在沒有錯誤的情況下不顯示"error"
變量? 對於這種情況,當列表不為空並且找到搜索到的實例時。
您可以實現自定義異常處理程序:
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 and response.status_code == 404:
response.data = {
"message": "Instance not found.",
"error": "HTTP_404_NOT_FOUND",
}
return response
要為您的項目應用此處理程序,請將其添加到REST_FRAMEWORK
設置中:
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.