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请求,响应内容')