1

今朝、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 に変換する方法を知っている人はいますか?

4

1 に答える 1

2

シリアライズされた json 文字列としてではなく、json として応答コンテンツを送信することをお勧めします。

import json
bundle = {"code": 777, "status": False, "error": json.loads(e.response.content)}
于 2012-09-26T17:06:49.080 に答える