Как проверить аргументы сообщения в Django

Я видел много решений о том, как проверять параметры полей формы, но я не использую шаблоны Django и вообще не реализую фронтенд в Django. Мне нужна исключительно серверная валидация на стороне бэкенда. Допустим, у меня есть

@api_view(['POST'])

def my_func(request):

И я хочу, чтобы данные были примерно такими:

{
  "username" : <user>,
  "password" : <pw>,
  "age"      : <age>
}

Я хочу проверить, что username и password являются строками, возможно, с требованием минимальной длины. И что age - это число, опять же, возможно, с другими ограничениями, такими как min/max.

Существует ли стандартный способ сделать это?

Универсальным стандартом является использование форм. Вы можете использовать их, даже если ваши представления не используют шаблоны django, вместо этого вы просто инстанцируете экземпляр формы вручную. Я покажу это ниже.

# forms.py
from django import forms
from django.core.validators import MinLengthValidator, MaxValueValidator, MinValueValidator

class RequestBodyForm(forms.Form):
    username = forms.CharField(max_length=100, validators=[MinLengthValidator(10)])
    password = forms.CharField(max_length=100, validators=[MinLengthValidator(20)])
    age      = forms.IntegerField(
                validators=[
                    MinValueValidator(18), 
                    MaxValueValidator(100)
                ])
# views.py
from .forms import RequestBodyForm

@api_view(['POST'])
def my_func(request):
    data = RequestBodyForm(request.POST)
    if data.is_valid():
        # Data was valid, proceed with whatever it is you need to do
    else:
        # Data was invalid, handle/return the failure

Однако вы не ограничены формами. Сериализаторы DRF зависят от конкретного случая, и я бы посоветовал использовать вместо них этот, поскольку вы все равно используете DRF.

Для вашего конкретного случая использования, поля сериализатора имеют встроенные опции проверки:

# serializers.py
class RequestBodySerializer(serializers.Serializer):
    username = serializers.CharField(max_length=100, min_length=10)
    age      = serializers.IntegerField(max_value=100, min_value=18)

Или вы можете добавить пользовательскую логику проверки для каждого поля, используя соглашение .validate_<field_name>():

# serializers.py
class RequestBodySerializer(serializers.Serializer):
    age      = serializers.IntegerField()

    def validate_age(self):
        if age < 18 or age > 100:
            raise serializers.ValidationError("Disallowed age")
Вернуться на верх