Как обезопасить полезные данные post / put / patch в представлениях Django? - PullRequest
1 голос
/ 28 июня 2019

Я уже некоторое время пользуюсь сериализаторами django, и, похоже, каждый раз, когда я отправляю полезную нагрузку с помощью put / post / patch, serializers.is_valid() проверяет только правильность типов атрибутов данных полезной нагрузки, присутствуют необходимыеи не проверяет, есть ли избыточные данные в полезной нагрузке, не определенной в models.py

Допустим, у меня есть models.py :

    class Task(models.Model):
        title = models.CharField(max_length=100, default='default_task_name')
        description = models.CharField(max_length=1000, blank=True, default='')
        complete = models.BooleanField(default=False)
        canceled = models.BooleanField(default=False)
        date = models.DateTimeField(auto_now_add=True)

        class Meta:
            ordering = ('id', 'date')

В моем serializers.py у меня есть следующее:

    from rest_framework import serializers
    from .models import Task


    class TaskSerializer(serializers.ModelSerializer):
        class Meta:
            model = Task
            fields = '__all__'

В моем views.py у меня есть следующее:

    class TaskDetails(APIView):
        def get_object(self, pk):
            try:
                return Task.objects.get(pk=pk)
            except Task.DoesNotExist:
                raise Http404
        def put(self, request, pk):
            data = JSONParser().parse(request)
            serializer = TaskSerializer(self.get_object(pk), data=data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=HTTP_201_CREATED)
            return Response(serializer.errors, status=HTTP_422_UNPROCESSABLE_ENTITY)

с использованием cURL:

curl -X PUT -H "Content-Type: application/json" -d '{"title":"task_1", "description":"learning rest", "task_force":"undefined "}' "my_api_uri"

I, за исключением получения ошибки, подобной этой:

'errors': {'task_force': ['undefined attribute task_force'], 'status_code': '422'}

, поскольку полезная нагрузка содержит task_force, который не определен внутри models.py или serializers.py

Но я получаю ответ без ошибок:

{data={"title":"task_1", "description":"learning rest", "task_force":"undefined "}, "status_code": '201'} `

Какая здесь работа, чтобы выполнить эту проверку с помощью сериализатора?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...