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字段长

通过以上可以验证检验是生效的。