5

DjangoRestFramework はさまざまな方法でエラーを処理しているようです。シリアライザー クラスの ValidationError は、常に同じ JSON を返すわけではありません。

現在の応答には、JSON リスト/オブジェクト文字列が含まれています。

{"detail":["Unable to log in with provided credentials."]}

達成したいこと:

{"detail":"Unable to log in with provided credentials."}

この応答がデフォルト関数の結果であることを認識しています。ただし、検証関数をオーバーライドしました。

class AuthCustomTokenSerializer(serializers.Serializer):
username = serializers.CharField(write_only=True)
password = serializers.CharField(write_only=True)
token = serializers.CharField(read_only=True)

def validate(self, validated_data):
    username = validated_data.get('username')
    password = validated_data.get('password')

    # raise serializers.ValidationError({'detail': 'Unable to log in with provided credentials.'})

    if username and password:
        user = authenticate(phone_number=username, password=password)

        try:

            if UserInfo.objects.get(phone_number=username):
                userinfo = UserInfo.objects.get(phone_number=username)
                user = User.objects.filter(user=userinfo.user, password=password).latest('date_joined')

            if user:

                if user.is_active:
                    validated_data['user'] = user
                    return validated_data

                else:
                    raise serializers.ValidationError({"detail": "User account disabled."})

        except UserInfo.DoesNotExist:
            try:
                user = User.objects.filter(email=username, password=password).latest('date_joined')

                if user.is_active:
                    validated_data['user'] = user
                    return validated_data

            except User.DoesNotExist:
                #raise serializers.ValidationError("s")
                raise serializers.ValidationError({'detail': 'Unable to log in with provided credentials.'})
    else:
        raise serializers.ValidationError({"detail" : "Must include username and password."})

class Meta:
    model = Token
    fields = ("username", "password", "token")

カスタム例外ハンドラを追加しようとしました:

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

ビュー.py:if serializer.is_valid(raise_exception=True):

ただし、それは現在発生しているエラーのみを追加します。

{"detail":["Unable to log in with provided credentials."],"status_code":400}

返されるテキストの形式を変更するにはどうすればよいですか? 検証関数内のこの特定のシリアライザーに対して、このような JSON のみを返します。

non_field_errors テンプレートのフォーマットも調べましたが、他のすべてのシリアライザーで動作します。

{"detail": "Account exists with email address."}
4

1 に答える 1

0

おそらく、json レンダラー クラスをオーバーライドして、ステータス コードと応答データのキーを確認できるカスタム クラスを接続してからdetail、値を適切に再フォーマットする必要があります。

私はそれを試したことがないので、正確なコードベースを提供することはできませんが、これは一貫した応答を得るために私が考えることができる唯一のアプローチです.

于 2016-02-22T20:57:13.453 に答える