1. 相关概念及特点
DRF含义:
Django Rest Framework 是基于Django框架,采用Restful设计模式,写出的组件模块
整体流程:
客户端向服务端发请求,服务端返回数据,通常Django通过表中查询的数据都是queryset,里面存放着大量的模型类 对象(查询出来的数据对象),返回时,根据客户端语言的不同,要序列化成不同的格式,客户端拿到数据反序列化.
通常返回json或xml格式的数据.所有编程语言都能识别
DRF特点:
● 提供序列化和反序列化操作,内置了序列化器Serializer
● 提供了丰富的类视图 , Mixin扩展类 简化视图编写
● 提供认证,权限,限流,过滤,分页,接口文档等等功能
描述本文内容实现功能:
(1)操作主要针对DRF的get,post请求进行模拟操作,熟悉DRF简单操作原理
(2)增加字段的校验,防止不可用字段写入数据库
(3)DRF里面无需注释csrf中间件功能,防止跨网站修改数据
2. 整个项目的Django内容截图
3. 建立数据库及model
【数据库连接】
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 'NAME':'drfdb01', 'USER': 'root', # 连接数据库的用户名 'PASSWORD': 'REDHAT', # 连接数据库的密码 'HOST': '127.0.0.1', # IP地址 'POST': 3306, # 端口号 } }
【model】
from django.db import models # Create your models here. class Student(models.Model): # 模型字段 name = models.CharField(max_length=100,verbose_name="姓名") sex = models.BooleanField(default=1,verbose_name="性别") age = models.IntegerField(verbose_name="年龄") class_null = models.CharField(max_length=5,verbose_name="班级编号") description = models.TextField(max_length=1000,verbose_name="个性签名") ## 元类Meta,定义类的元素属性 class Meta: ## 自定义表明 db_table="tb_student" ## 自定义表的中文名(单数) verbose_name = "学生" ## 自定义表的中文名(复数) verbose_name_plural = "学生"
4. 建立url路由
from django.contrib import admin from django.urls import path from app1 import views urlpatterns = [ path('admin/', admin.site.urls), path('index/', views.StudentView.as_view()), ]
5. 建立视图
from django.shortcuts import render,HttpResponse,redirect # from django.views import View from app1.models import Student ## 导入要进行测试的表 from rest_framework import serializers from rest_framework.response import Response from rest_framework.views import APIView # Create your views here. class StudentSerializer(serializers.Serializer): ## 自定义序列化器 name = serializers.CharField(max_length=100) sex = serializers.BooleanField(default=1) age = serializers.IntegerField() class_null = serializers.CharField(max_length=5) description = serializers.CharField(max_length=1000,required=False) # required=False 非必须字段,允许为空 class StudentView(APIView): def get(self, request): ## 1. 获取单条序列化方法[一个模型类对象] # data = Student.objects.get(pk=1) ## 获取id=1的数据信息 # ss = StudentSerializer(instance=data) ## 进行序列化 # res = ss.data ## 序列化获取数据 # return Response(res) ## get返回客户端数据
## 测试结果 ''' postman数据如下: { "name": "lisi", "sex": true, "age": 14, "class_null": "2", "description": "www" } ''' ## 2. 多条数据的序列化方法[queryset] # data = Student.objects.all() # ss = StudentSerializer(instance=data,many=True) # res = ss.data # return Response(res) ''' postman返回数据 [ { "name": "lisi", "sex": true, "age": 14, "class_null": "2", "description": "www" }, { "name": "zhangsan", "sex": false, "age": 15, "class_null": "1", "description": "rrr" }, { "name": "wangwu", "sex": true, "age": 14, "class_null": "1", "description": "yy" } ] ''' ## 3. 可以额外序列化更多数据,通过context关键词指定 data = Student.objects.all() ss = StudentSerializer(instance=data,many=True,context={"aaabbb":234}) res = ss.context return Response(res)
## 测试结果 ''' postman 返回值: { "aaabbb": 234 } ''' def post(self, request): # print(request.GET, "<GET>") # print(request.POST, "<POST>") # print(request.data, "<DATA>") """ # 反序列化(收数据) # instance=(写要序列化的数据) data=(写要反序列化的数据) ss = StudentSerializer(data=request.data) # print(ss.data) # 检测数据是否校验成功 print(ss.is_valid()) # 获取错误的原因 print(ss.errors) # 获取正确数据 print(ss.validated_data) """ ss = StudentSerializer(data=request.data) ## 获取的到的数据进行反序列化 if ss.is_valid(): ## 检测数据是否校验成功 data = Student.objects.create(**ss.validated_data) ## 写入到数据库 **进行解包 ss2 = StudentSerializer(instance=data) ## 进行序列化返回postman验证写入成功 return Response(ss2.data) else: return Response(ss.errors) ## 获取错误的原因
## 测试结果 ''' postman数据返回: { "name": "laoliu", "sex": false, "age": 16, "class_null": "2", "description": "" } ''' # return Response({})
6. 测试
(1)get操作如3小节postman内容
(2) post操作,通过postman
【数据库查看添加数据成功】
7. 增加字段校验
在自定义序列化器里面增加如下:
class StudentSerializer(serializers.Serializer): ## 自定义序列化器
## 对单个字段的 校验 validate_字段名 def validate_name(self,value): if value == "abc": raise serializers.ValidationError("不让起这个名字") return value
## 多个字段校验validate def validate(self, attrs): name = attrs["name"] class_null = attrs["class_null"] if len(name) > len(class_null): raise serializers.ValidationError("名字太长了") return attrs
8. 验证校验
(1)检验1:往数据库写入数据,name:abc 为序列化器不用写入的字符,postman返回“不让起这个名字”
(2)检验2:字段name长度不能比class_null字段长
通过以上可以验证检验是生效的。