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

原文地址:https://www.cnblogs.com/JackShi/p/13297462.html