2012-09-26 4 views
1

오늘 아침에 Tastypie로 장고 REST API를 개발했습니다. 문제가 발생했을 때 해결 방법을 모릅니다.Tastypie의 JSON으로 예외 오류를 반환합니다.

class UserSignUpResource(ModelResource): 

    class Meta: 
     object_class = User 
     queryset = User.objects.all() 
     allowed_methods = ['post'] 
     include_resource_uri = False 
     resource_name = 'newuser' 
     serializer = CamelCaseJSONSerializer(formats=['json']) 
     authentication = Authentication() 
     authorization = Authorization() 
     always_return_data = True 
     validation = FormValidation(form_class=UserSignUpForm) 

이 자원은 JSON 포맷 된 데이터를 수신하고 새로운 자원 (I에만 permmit POST 작전)을 생성 : 나는 다음과 같습니다 자원을 가지고있다. 그래서, 먼저 데이터를 통해 판정한다

validation = FormValidation(form_class=UserSignUpForm) 

것은 데이터가 잘못된 경우, 그것은 ImmediateHttpResponse을 반환한다는 것을입니다.

except ImmediateHttpResponse, e: 
    bundle = {"code": 777, "status": False, "error": e.response.content} 
    return self.create_response(request, bundle, response_class = HttpBadRequest) 

이 코드는 예외를 제대로 캡처 :

{"status": False, "code": 777, "errors": {"pass":["Required"], ...} 

그래서, 나는 다음과 같은 코드를 내 wrap_view을 무시하고 추가 : 그러나 나는이 예외를 포착하고이 같은 JSON을 만들 것 ,하지만 문제가 있습니다. e.response에는 오류가있는 유니 코드 문자열이 들어 있습니다. 그래서, 마지막주는 응답은 \와 그가를 "나를 죽이고하는 것은. 다른 측면에서, AJAX 작업을하는 프론트 엔드 개발자가, 나에게 말한다 첫번째 구문 분석 할 수없는 저주

{"code": 777, 
"error": "{\"birthdayDay\": [\"This field is required.\"], 
     \"birthdayMonth\": [\"This field is required.\"], 
     \"birthdayYear\": [\"This field is required.\"], 
     \"csrfmiddlewaretoken\": [\"This field is required.\"], 
     \"email\": [\"This field is required.\"], 
     \"email_2\": [\"This field is required.\"], 
     \"firstName\": [\"This field is required.\"], 
     \"gender\": [\"This field is required.\"], 
     \"lastName\": [\"This field is required.\"], 
     \"password1\": [\"This field is required.\"]}", 
"status": false} 

입니다 오류

내가 여기서 뭔가 잘못을하고있는 중이 야 누구는 JSON으로, 예외 응답을 변환하는 방법을

+1

'e.response.content'는 사전이 아닌 문자열로 보입니다. 그렇기 때문에 JSON 시리얼 라이저가이를 처리합니다. – Wessie

답변

2

을 당신은 아마 직렬화 된 JSON 문자열로 JSON으로 응답 내용을 보낼 알고 않습니다.?

import json 
bundle = {"code": 777, "status": False, "error": json.loads(e.response.content)} 
+0

대단히 감사합니다! 그것은 효과가있다! – Cibomank

관련 문제