1、测试POST接口
-
SnippetList
image.png
models.py
class Snippet(models.Model):
title = models.CharField(max_length=20, blank=True, default='', verbose_name='代码片段标题')
code = models.TextField()
linenos = models.BooleanField(default=False) # 是否显示行号
created_time = models.DateTimeField(auto_now_add=True)
serializers.py
from rest_framework import serializers
from .models import Snippet
class SnippetSerializer(serializers.ModelSerializer):
class Meta:
model = Snippet
# fields指定输出的字段
fields = ('id', 'title', 'code', 'linenos')
# extra_kwargs:serializer对post/put数据进行校验
extra_kwargs = {
# 反序列化之后保存title到数据库时的格式限制
'title': {
'required': True,
'min_length': 2,
'max_length': 10,
'error_messages': {
'required': 'title字段必填',
'min_length': '字段太短',
'max_length': '字段太长',
}
},
'code': {
'required': True
},
'id': {
'read_only': True,
},
}
# title不允许重复
def validate_title(self, title):
if Snippet.objects.filter(title=title).first():
raise serializers.ValidationError("title已经存在")
return title
views.py
from rest1020.models import Snippet
from rest1020.serializers import SnippetSerializer
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.status import HTTP_201_CREATED, HTTP_200_OK, HTTP_400_BAD_REQUEST, HTTP_204_NO_CONTENT, HTTP_404_NOT_FOUND
# 列出所有snipptes或者创建一个新的snippet
class SnippetList(APIView):
def get(self, request):
snippets = Snippet.objects.all()
serializer = SnippetSerializer(snippets, many=True)
serializer_data = serializer.data
return Response(serializer_data, status=HTTP_200_OK)
def post(self, request):
# print(type(request)) # <class 'rest_framework.request.Request'>
# print(type(request.data)) # dict类型
serializer = SnippetSerializer(data=request.data)
# 参数校验
if serializer.is_valid():
# title名称不允许重复
if serializer.validate_title(request.data['title']):
serializer.save()
return Response(serializer.data, status=HTTP_201_CREATED)
return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)
测试结果
1、title不传递时,报错400
image.png
2、title传递但长度不符合规定时,报错400
image.png
3、title为空字符串
image.png
4、title名称已经存在
image.png
5、title符合规则,请求成功
image.png
改写views.py使用serializer.is_valid(raise_exception=True)
- views.py
def post(self, request):
serializer = SnippetSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data, status=HTTP_201_CREATED)
return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)
-
接口测试:title名称已经存在
image.png
2.测试 PUT接口
-
SnippetDetail
image.png
1、对象不存在时的处理:返回体:提示用户不存在,状态:422
3、测试GET接口
- 对象不存在时的处理:
- 返回体:空,状态:200
- 返回体:提示用户不存在,状态:422
4. 自定义Response结构体
5、使用generics通用视图
- 使用generics通用视图后,API页面端点会显示有2种
-
有Raw data和HTML form两种格式
HTML form格式
Raw data格式
网友评论