2015-05-29 5 views
16

Şu anda Django REST Framework'e dayalı bir görünüm için bazı kodum var. Bir müşteri özel durum sınıfı kullanıyorum, ancak ideal olarak dahili Django REST istisnalarını kullanmak istiyorum.Django REST İstisnalar

Aşağıdaki koddan REST Framework istisnalarını en yüksek değerine kullanmanın en iyi veya en temiz yolu olmadığını düşünüyorum.

Herkesin sorunları yakaladığı ve REST istisnaları dışında temiz bir şekilde iade ettiği iyi örnekler var mı?

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) 

cevap

28

yükseltmek.

Bu işlemi normalde Python verir gibi sizin görünümünde istisnalar yükseltebilirsiniz:

from rest_framework.exceptions import APIException 

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

Ayrıca APIException devralan ve status_code ve default_detail ayarlayarak kendi özel istisna oluşturabilir. olanlar inşa bazıları şunlardır: ParseError, AuthenticationFailed, NotAuthenticated, PermissionDenied, NotFound, NotAcceptable, ValidationError vb

Bunlar daha sonra DİNLENME Framework'ün istisna işleyicisi tarafından Response şuna dönüştürülür. Her özel durum, Response'a eklenen bir durum koduyla ilişkilendirilir. Varsayılan olarak istisna işleyicisi olarak ayarlanır işleyicisi inşa:

REST_FRAMEWORK = { 
    'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler' 
} 

Ama sen settings.py dosyasında bu değiştirerek istisnaları kendini dönüştürmek istiyorsanız kendi özel durum işleyici olarak ayarlayabilirsiniz:

REST_FRAMEWORK = { 
    'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler' 
} 

Ve sonra bu konumda özel işleyicisi oluşturmak:

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 
3

Sen build in DRF exception, sadece ithalat kullanabilir ve çoğunlukla DRF en APIException alt sınıfları olan Django DİNLENME çerçeve birkaç built in exceptions sağlar

from rest_framework.exceptions import 
... 
raise ParseError('I already have a status code!') 
+0

Bu sadece özel durum oluşturur. Cevap da vermedi mi? * – felix001

+0

("bu hata görünür") zam APIException deneyin veya rest_framework.exceptions içe gelen PermissionDenied, ValidationError istisnası Tepki dönüştürülmüş olur felix001 ParserError – Ramast

+1

@ hakkında emin değil, daha fazla bilgi – EmptyFlash