Utilisation d'APIView et tests d'interface

  1. Utilisation d'APIView

ModelViewSet est un wrapper autour de APIView. ModelSerializer est un wrapper autour de Serializer.

1.1 Ajout de la route dans user/urls.py


from django.urls import path
from . import views

urlpatterns = [
   path('api/users/', views.UserInfoAPIView.as_view(), name='user-list-create'),
   path('api/users/<pk>/', views.UserInfoAPIView.as_view(), name='user-detail-update-delete'),
]
 </pk>

1.2 Création du fichier user/serializers.py pour le sérialiseur

Explication des paramètres de champ pour serializers.ModelSerializer et serializers.Serializer :

  • read_only=True : Indique que le champ ne peut pas être modifié par l'utilisateur et est uniquement destiné à la sortie de l'API. Aucune validation n'est effectuée pour ce champ lors de la sérialisation. Le champ est inclus dans la réponse sérialisée.
  • write_only=True : Indique que le champ peut être utilisé lors de la création ou de la mise à jour d'une instance, mais n'est pas inclus dans la réponse sérialisée.
  • required=True (par défaut) : Indique que le champ est obligatoire lors de la désérialisation (la donnée renvoyée par le frontend doit inclure ce champ). Si défini sur False, le champ n'est pas obligatoire.
  • allow_null=True : Permet au champ d'avoir une valeur None. Si défini sur False, le champ ne peut pas être None.
  • allow_blank=True : Permet au champ d'être une chaîne vide.
  • label : Une étiquette pour le champ, utilisée pour son affichage.
  • help_text : Un texte d'aide pour décrire le champ.
  • style : Spécifie le type de champ pour le rendu.
  • error_messages : Un dictionnaire pour personnaliser les mesasges d'erreur en cas de validation échouée.

Création du sérialiseur dans user/serializers.py :


from rest_framework import serializers
from .models import User  # Assurez-vous que votre modèle User est importé

class UserProfileSerializer(serializers.Serializer):
   user_id = serializers.IntegerField(read_only=True, source='pk') # Utilise le pk du modèle comme user_id
   user_name = serializers.CharField(
       max_length=50,
       required=True,
       error_messages={'required': 'Le nom d\'utilisateur est requis.'}
   )
   profile_picture = serializers.ImageField(required=False)
   display_name = serializers.CharField(max_length=100, required=False)
   location = serializers.CharField(max_length=255, required=False)
   custom_field = serializers.SerializerMethodField(read_only=True) # Champ personnalisé pour l'affichage

   class Meta:
       model = User
       fields = '__all__' # Ou spécifiez les champs comme ['user_id', 'user_name', ...]

   def get_custom_field(self, obj):
       ''' obj: L'objet User passé '''
       # Exemple : renvoyer le nom d'utilisateur concaténé avec un préfixe
       return f"USR_{obj.username}"

   def create(self, validated_data):
       ''' Appelée lorsque ser.save() est utilisé pour la création '''
       return User.objects.create(**validated_data)

   def update(self, instance, validated_data):
       ''' Appelée lorsque ser.save() est utilisé pour la mise à jour '''
       instance.username = validated_data.get('username', instance.username)
       instance.save()
       return instance

   def validate_user_name(self, value):
       ''' Validation spécifique pour le champ user_name '''
       if value.lower() == 'admin':
           raise serializers.ValidationError('Impossible de créer un utilisateur avec le nom "admin".')
       return value

   def validate(self, attrs):
       ''' Validation multi-champs '''
       if attrs.get("user_name") and attrs.get("user_name").lower() == 'root':
           raise serializers.ValidationError('Impossible de créer un utilisateur avec le nom "root".')
       return attrs
 

1.3 Ajout de la vue dans user/views.py


from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import User
from .serializers import UserProfileSerializer

class UserProfileAPIView(APIView):
   def get(self, request, pk=None, format=None):
       if pk:
           try:
               user_instance = User.objects.get(pk=pk)
               serializer = UserProfileSerializer(user_instance)
           except User.DoesNotExist:
               return Response({"detail": "Utilisateur non trouvé."}, status=status.HTTP_404_NOT_FOUND)
       else:
           users_queryset = User.objects.all()
           serializer = UserProfileSerializer(users_queryset, many=True)
       return Response(serializer.data, status=status.HTTP_200_OK)

   def post(self, request, format=None):
       serializer = UserProfileSerializer(data=request.data)
       if serializer.is_valid():
           serializer.save()
           return Response(serializer.data, status=status.HTTP_201_CREATED)
       return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

   def put(self, request, pk, format=None):
       try:
           user_instance = User.objects.get(pk=pk)
       except User.DoesNotExist:
           return Response({"detail": "Utilisateur non trouvé."}, status=status.HTTP_404_NOT_FOUND)

       serializer = UserProfileSerializer(user_instance, data=request.data)
       if serializer.is_valid():
           serializer.save()
           return Response(serializer.data, status=status.HTTP_200_OK)
       return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

   def delete(self, request, pk, format=None):
       try:
           user_instance = User.objects.get(pk=pk)
           user_instance.delete()
           return Response(status=status.HTTP_204_NO_CONTENT)
       except User.DoesNotExist:
           return Response({"detail": "Utilisateur non trouvé."}, status=status.HTTP_404_NOT_FOUND)
 
  1. Tests d'interface

2.1 Requête pour obtenir tous les utilisateurs

Méthode : GET

URL : /api/users/

2.2 Requête pour créer un utilisateur

Méthode : POST

URL : /api/users/

Corps de la requête (JSON) :


{
   "user_name": "nouveau_utilisateur",
   "display_name": "Nouveau Compte",
   "location": "Quelque part"
}
 

2.3 Requête pour mettre à jour un utilisateur

Méthode : PUT

URL : /api/users/<user_id>/ (remplacez <user_id> par l'ID de l'utilisateur)

Corps de la requête (JSON) :


{
   "display_name": "Compte Mis à Jour",
   "location": "Ailleurs"
}
 

2.4 Requête pour supprimer un utilisateur

Méthode : DELETE

URL : /api/users/<user_id>/ (remplacez <user_id> par l'ID de l'utilisateur)

Étiquettes: DRF APIView serializers REST API Tests d'API

Publié le 16 août à 15h04