J'ai actuellement du code pour une vue basée sur le Django REST Framework. J'ai utilisé une classe d'exception client, mais idéalement je veux utiliser le = intégré) Django REST exceptions.
D'après le code ci-dessous, je pense que ce n'est probablement pas la manière la meilleure ou la plus propre d'utiliser les exceptions du framework REST à son maximum).
Quelqu'un a-t-il de bons exemples où il détecte des problèmes et les renvoie proprement avec les exceptions REST intégrées?
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)
Le cadre Django REST fournit plusieurs exceptions intégrées , qui sont principalement des sous-classes de APIException
de DRF).
Vous pouvez lever des exceptions dans votre vue comme vous le feriez normalement en Python:
from rest_framework.exceptions import APIException
def my_view(request):
raise APIException("There was a problem!")
Vous pouvez également créer votre propre exception personnalisée en héritant de APIException
et en définissant status_code
et default_detail
. Certains de ceux intégrés sont: ParseError
, AuthenticationFailed
, NotAuthenticated
, PermissionDenied
, NotFound
, NotAcceptable
, ValidationError
, etc.
Ceux-ci seront ensuite convertis en Response
par le gestionnaire d'exceptions du Framework REST. Chaque exception est associée à un code d'état qui est ajouté au Response
. Par Par défaut, le gestionnaire d'exceptions est défini sur le gestionnaire intégré:
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler'
}
Mais vous pouvez le définir sur votre propre gestionnaire d'exceptions personnalisé si vous souhaitez convertir les exceptions vous-même en modifiant cela dans votre settings.py
fichier:
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
}
Et puis créez le gestionnaire personnalisé à cet emplacement:
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
Vous pouvez utiliser construire dans l'exception DRF , il suffit d'importer et d'augmenter
from rest_framework.exceptions import
...
raise ParseError('I already have a status code!')