API:权限,认证,限流,序列化,过滤,排序,版本,分页


API:权限,认证,限流,序列化,过滤,排序,版本,分页



1、APIview的使用

  • ModelViewSet是对APIview封装
  • ModelSerializer是对Serializer封装

1.1、在user/urls.py中添加路由

urlpatterns=[
    path('apiview/',views.UserInfoViewSet.as_view()),
]

1.2、创建user/serializer.py写序列化器


  • serizlizers.ModelSerializerserializer.Serializerfield参数说明
'''field参数'''
 1. real_only  
# real_only = True 表示不允许用户自己上传,只能用于api的输出,序列化的时候也不用对这个数据进行验证,系列化返回是有该字段
 2. wirte_only
 # write_only = True 表示在更新或创新创建实例时可以使用该字段,但在序列化返回是不包括该字段。
 3. required:该字段是必须的,不能为空
 # required = True 反序列化(前端返回数据必须包含此字段)的时候必须提供这个字段 设置False可以不提供
 4.allow_null/all_blank: 该字段允许为null/空
 # allow_null = True 可以为null,设置False则不能为null
 5. label:标签,用于对字段的显示设置
 6. help_text: 对该字段进行解释的一段文本,用于提示
 7. style:说明该字段的类型
 8. error_messages: 该字段出错是,信息提示
  • 创建user/serializers.py写序列化器
class UserInfoSerializer(serializer.Serializer):
    id = serializer.CharField(read_only=True) # 普通字段,设置id为只读字段,不能修改
    username = serializer.CharField(min_length=3,max_length=20,error_message={'required':'该字段必填'})  # 显示普通字段
    img = serializer.ImageField(required=False)
    nick_name = serializer.CharField(max_length=255)
    xxx = serializers.SerializerMethodField(read_only=True) # 自定义显示(显示多对多)
    
    class Meta:
        model = User
     
    # 自定义显示,多对多字段
    def get_xxx(selef,row):
    '''row:传过来的正是User表的对象'''
    users = row.username # 获取用户名
    return user

	def create(self,validated_data):
        '''validated_data:表单或vue请求携带的json:{"username":"zhangsan"password":"123456"}'''
        return User.objects.create(**validated_data)
    
    # 定义单一字段验证的方法:
    def validate_name(self,value):
        if value =='root':
            raise serializers.ValidationError("不能创建管理员账号")
         return value
    
    # 定义多字段验证方法
    def validate(self,attrs):
        if attrs.get('username') == 'admin':
            raise serializers.ValidationError('不能创建admin用户')
         return attrs

1.3、在user/views.py中添加视图函数


from user.serializers import UserInfoSeiralizer


class UserInfoViewSet(APIView):
    def get(self,request,*args,**kwargs):
        # 一对多、多对多查询都是一样的语法
        obj = User.objects.all()
        ser = UserInfoSerializer(instance=obj,many=True) # 关联数据多个
        # ser = UserInfoSerlializer(instance=obj[0]) # 关联数据第一个
        return Response(ser.data,status=200)
    
    # 创建用户
    def post(self,request):
        ser = UserInfoSerializer(data=request.data)
        # 判断提交数据是否合法
        if ser.is_valid():
            ser.save()
            return Response(data=ser.data,status=201)
        return Response(data=ser.error,status=400)
    
    # 更新用户信息
    def put(self,request):
        pk = request.query_params.get('pk')
        try:
            userinfo = User.objects.get(id=pk)
        excpet Excpetion as e:
            return Response(data='用户不存在',satus=201)
        if ser.is_valid():
            ser.save()
         return Response(data=ser.error,status=400)
    

2、测试接口

2.1、查询所有用户


http://192.168.56.100:8888/user/apiview/

2.2、创建用户


http://192.168.56.100:8888/user/apiview/

2.3、更新用户信息


http://192.168.56.100:8888/user/apiview/?pk=7

2.4、限流功能测试


原文地址:https://www.cnblogs.com/ml594/p/13745940.html