今朝、Tastypie で Django REST API を開発していたときに、解決方法がわからない問題に遭遇しました。次のようなリソースがあります。
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)
この Resource は JSON 形式のデータを受け取り、新しい Resource を作成します (POST ops のみを許可します)。したがって、最初にデータは次の方法でチェックされます。
validation = FormValidation(form_class=UserSignUpForm)
問題は、データが正しくない場合、ImmediateHttpResponseを返すことです。しかし、この例外をキャプチャして、次のような JSON を作成したいと思います。
{"status": False, "code": 777, "errors": {"pass":["Required"], ...}
そこで、wrap_viewをオーバーライドして、次のコード スニペットを追加します。
except ImmediateHttpResponse, e:
bundle = {"code": 777, "status": False, "error": e.response.content}
return self.create_response(request, bundle, response_class = HttpBadRequest)
このコードは例外を適切にキャプチャしますが、問題があります。e.responseには、エラーを含む Unicode 文字列が含まれています。したがって、最終的に得られる応答は次のとおりです。
{"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}
いまいましい \ と最初の " が私を殺しています。一方、AJAX を扱っているフロントエンド開発者は、エラーを解析できないと言っています。
私はここで何か悪いことをしていますか? 例外応答を JSON に変換する方法を知っている人はいますか?