2015-01-28 17 views
8

Bir doğrulama hatası oluştuğunda hangi rest_framework veya django döndürdüğü JSON'u değiştirmek istiyorum.DRF'de doğrulama hatası yanıtları nasıl değiştirilir?

Örneklerimden birini örnek olarak kullanacağım, ancak tüm iletilerim için hata iletilerini değiştirmek istiyorum. Öyleyse, bu görünümü kullanıcılara giriş yapmak, e-posta ve şifre sağlamak anlamına geldiğini varsayalım. Bunlar doğruysa, access_token değerini döndürür. Ben sadece şifreyi yayınlarsam

, bu hatayı 400 döndürür:

{"email": ["This field is required."]} 

ve şifre ve e-posta maçı dont:

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

ne olacağını istiyorum fazla gibi:

{"errors": [{"field": "email", "message": "This field is required."}]} 

{"errors": [{"non-field-error": "Unable to log in with provided credentials."}]} 

Şimdi bu benim görünüm:

class OurLoginObtainAuthToken(APIView): 
    permission_classes = (AllowAny,) 
    serializer_class = serializers.AuthTokenSerializer 
    model = Token 

    def post(self, request): 
     serializer = self.serializer_class(data=request.DATA) 
     if serializer.is_valid(): 
      #some magic 
      return Response(token)   
     return Response(serializers.errors, status=status.HTTP_400_BAD_REQUEST) 

Ben serializer.errors erişebilir ve bunları değiştirebilir, ancak nasıl doğrulamak da yöntem benim serializer`s oluşturulan doğrulama hataları değiştirmek için bu şekilde, ulaşılabilir sadece saha hataları gibi görünüyor olabilir?

Bu kullanıcı adı ancak e-posta gerektiren doesnt benim serileştirici (o rest_framework.authtoken.serializers.AuthTokenSerializer aynı seri hale getirici) ama düzenlenebilir, böylece kimlik doğrulama:

class AuthTokenSerializer(serializers.Serializer): 
    email = serializers.CharField() 
    password = serializers.CharField() 

    def validate(self, attrs): 
     email = attrs.get('email') 
     password = attrs.get('password') 
     #print email 
     #print password 
     if email and password: 
      user = authenticate(email=email, password=password) 

      if user: 
       if not user.is_active: 
        msg = _('User account is disabled.') 
        raise ValidationError(msg) 
       attrs['user'] = user 
       return attrs 
      else: 
       msg = _('Unable to log in with provided credentials.') 
       raise ValidationError(msg) 
     else: 
      msg = _('Must include "username" and "password"') 
      raise ValidationError(msg) 

Ya da belki bambaşka var yaklaşım? Herhangi bir fikir için gerçekten çok teşekkür ederim.

cevap

7

Uygulamanızdaki tüm görünümde hata stilini değiştirmenin en kolay yolu, her zaman serializer.is_valid(raise_exception=True) kullanın ve hata yanıtının nasıl oluşturulduğunu tanımlayan bir custom exception handler uygular.

+0

Ou evet, işe yarıyor! Size yeterince teşekkür edemeyeceğim Tom :) –

+0

Rica ederim! –

+0

Farklı bir yaklaşım için bkz http://stackoverflow.com/questions/26943985/custom-error-messages-in-django-rest-framework-serializer – frnhr

İlgili konular