zoukankan      html  css  js  c++  java
  • Django 之DRF原理操作

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

      

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

      

  • 相关阅读:
    jqGrid api 中文说明
    jsp + js + 前端弹出框
    js中关于带数字类型参数传参丢失首位数字0问题
    java中WGS84坐标(ios)转换BD-09坐标(百度坐标)
    Java中的“浅复制”与“深复制”
    Git错误:error:failed to push some refs to 'git@gitee.com:name/project.git'
    git操作教程
    线程调度及进程调度
    同步锁Lock
    多线程案例
  • 原文地址:https://www.cnblogs.com/NGU-PX/p/14266338.html
Copyright © 2011-2022 走看看