• rest-framework


    1. 解析器

    1. 配置(注意所有的解析器框架本身都有内置的)

    1. 全局配置
    REST_FRAMEWORK = {
        'DEFAULT_PARSER_CLASSES':[
            'rest_framework.parsers.JSONParser'  # 仅处理请求头content-type为application/json的请求体
            'rest_framework.parsers.FormParser'  # 仅处理请求头content-type为application/x-www-form-urlencoded 的请求体
            'rest_framework.parsers.MultiPartParser'  #  仅处理请求头content-type为multipart/form-data的请求体
        ]
    
    }
    
    2. 局部配置
    # 当同时有多个解析器时,rest-framework会根据content-Type自行对比,选择合适的解析器 parser_classes
    = [FormParser, ]

    2. 视图

      在视图类中使用request.data就可以获取解析后的内容

    3. 源码流程简介

      跟之前一样的流程,dispatch中将解析器封装在request中,调用request.data时,解析器解析数据

    2. 序列化

      作用:对用户请求数据进行验证和数据进行序列化

    1. 基本操作

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework import serializers
    from .. import models
    
    
    class PasswordValidator(object):  # 数据校验,类似于Django的form组件
        def __init__(self, base):
            self.base = base
    
        def __call__(self, value):
            if value != self.base:
                message = 'This field must be %s.' % self.base
                raise serializers.ValidationError(message)
    
        def set_context(self, serializer_field):
            """
            This hook is called by the serializer instance,
            prior to the validation call being made.
            """
            # 执行验证之前调用,serializer_fields是当前字段对象
            pass
    
    
    class UserSerializer(serializers.Serializer):  # 用于序列化的类
        ut_title = serializers.CharField(source='ut.title')  # 指定source=(orm中的字段名)时,ut_title可以随便起名字,但是如果没有指定,必须跟数据库里面的字段一样。当字段内定义了choices的时候,这里填上source='get_title_display'即可
        g_name = serializers.CharField(source='group.name')  # 当要序列化的字段是外键时,使用'.'来取值,可以有很多点。这里如果source='group'得到的是一个group对象
       user
    = serializers.CharField(min_length=6) pwd = serializers.CharField(error_messages={'required': '密码不能为空'}, validators=[PasswordValidator('666')])

       # 当为多对多关系时,要使用以下
       rls = serializers.SerializermethodField() # 自定义
       # 再写一个处理函数
       def get_rls(self, row): # 函数名要求是get_变量名,row是要处理的行对象
        return xxx
    class TestView(APIView): # 视图类 def get(self, request, *args, **kwargs): # 序列化,将数据库查询字段序列化为字典 data_list = models.UserInfo.objects.all() ser = UserSerializer(instance=data_list, many=True) # 序列化,many当data_list(queryset对象)有多个值的时候为True,只有一个的时候为False # # obj = models.UserInfo.objects.all().first() # ser = UserSerializer(instance=obj, many=False) return Response(ser.data) def post(self, request, *args, **kwargs): # 验证,对请求发来的数据进行验证 ser = UserSerializer(data=request.data) if ser.is_valid(): print(ser.validated_data) else: print(ser.errors) return Response('POST请求,响应内容')

     2. 使用ModelSerializer

    class ModelUserSerializer(serializers.ModelSerializer):  # ModelSerializer继承了Serializer
    
        ut_title = serializers.CharField(source='get_title_displaly')  # 在这里自己定义字段
    
        class Meta:
            model = models.UserInfo
            fields = "__all__"  # 写all的话仅展示简单的页面,choices只能展示数字
            # fields = ['user', 'pwd', 'ut', 'ut_title']  # 可以自己定制,在上面写需要定制的字段,在这里注册即可
            depth = 2  # 展示外键的层数,默认是0, 然后1表示去另一张表再深入拿数据,2表示再去下一张表拿数据。自动序列化链表
            extra_kwargs = {'user': {'min_length': 6}, 'pwd': {'validators': [PasswordValidator(666), ]}}
            # read_only_fields = ['user']
    
    
    class TestView(APIView):
        def get(self, request, *args, **kwargs):
    
            # 序列化,将数据库查询字段序列化为字典
            data_list = models.UserInfo.objects.all()
            ser = ModelUserSerializer(instance=data_list, many=True)
            #
            # obj = models.UserInfo.objects.all().first()
            # ser = UserSerializer(instance=obj, many=False)
            return Response(ser.data)
    
        def post(self, request, *args, **kwargs):
            # 验证,对请求发来的数据进行验证
            print(request.data)
            ser = ModelUserSerializer(data=request.data)
            if ser.is_valid():
                print(ser.validated_data)
            else:
                print(ser.errors)
    
            return Response('POST请求,响应内容')

     3. 版本

     推荐使用url中传参的方式

    1. settings.py
    REST_FRAMEWORK = {
        'DEFAULT_VERSION': 'v1',            # 默认版本
        'ALLOWED_VERSIONS': ['v1', 'v2'],   # 允许的版本
        'VERSION_PARAM': 'version'          # URL中获取值的key
    }

    2. urls.py

    from django.conf.urls import url, include
    from web.views import TestView
    
    urlpatterns = [
        url(r'^(?P<version>[v1|v2]+)/test/', TestView.as_view(), name='test'),
    ]

    3. views.py

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework.versioning import URLPathVersioning
    
    
    class TestView(APIView):
        versioning_class = URLPathVersioning
    
        def get(self, request, *args, **kwargs):
            # 获取版本
            print(request.version)
            # 获取版本管理的类
            print(request.versioning_scheme)
    
            # 反向生成URL
            reverse_url = request.versioning_scheme.reverse('test', request=request)
            print(reverse_url)
    
            return Response('GET请求,响应内容')

    参考网址:https://www.cnblogs.com/wupeiqi/articles/7805382.html

  • 相关阅读:
    POJ 1789:Truck History
    POJ 1258:Agri-Net Prim最小生成树模板题
    POJ 1837:Balance 天平DP。。。
    杭电1754--I Hate It(线段树)
    Poj3259--Wormholes(Spfa 判负环)
    杭电1068--Girls and Boys(二分图最大独立集)
    杭电1010--Tempter of the Bone(Dfs+剪枝)
    杭电2647--Reward(反向拓扑)
    杭电1083--Courses(二分图匹配)
    杭电2063--过山车(二分匹配)
  • 原文地址:https://www.cnblogs.com/JackShi/p/13297462.html
Copyright © 2020-2023  润新知