• DRF框架之请求生命周期、序列化组件


    DRF框架之请求生命周期、序列化组件

    Django回顾

    Django配置回顾

    1. 应用是否需要在INSTALLED_APPS中注册

      在没有使用到app的一些特殊操作时(比如数据库相关),可以不用注册,但是不注册后,应用的所有功能都能使用

      结论:所有应用都可以完成注册

    2. 数据库配置(全部在settings文件中完成即可)

      import pymysql
      pymysql.insatall_as_MySQLdb()
      DATABASE = {
      'default':{
      'ENGINE':'django.db.backends.mysql',
      'NAME':'数据库名',
      'USER':'账号',
      'PASSWORD':'密码',
      
      'HOST':'如果是127.0.0.1,该配置可以省略',
      'POST':3306,#如果是3306,该配置可以省略
      }
      }
      
    3. 路由分发

      主路由:将应用自己逻辑相关的路由交给自己处理

      from django.conf.urls import url,include
      urlpatterns = [
          #..
          url(r'^api/',include('api.urls')),	#/api/test/
      ]
      

    ORM配置回顾

    #models.py
    from django.db import modesl
    Class User(models.Model):
        SEX_CHOICE = (o,'男'),(1,'女')
        name = models.CharField(max_length=64,verbose_name='姓名')
        age = mdoels.IntgerField()
        height = models.DecimalField(max_digits=5,decimal_places=2,default=0)
        sex = models.IntegerField(choices=SEX_CHOICES,default=0)
        #sex = mdoels.CharField(choices=[('0','男'),('1','女')])
        
        
    #settings.py
    #root就是将文件夹添加到 os.oath 中
    MEDIA_ROOT = os.path.join(BASE_DIR,'media')
    #url就是配置路由 /路由名/
    MEDIA_URL = '/media/'
    
    
    #主路由最下方
    url(r'^media/(?P<path>.*)',server,{'document_root':settings.MEDIA_ROOOT})
    

    DRF框架的请求生命周期

    重写的as_view方法

    1. as_view方法完成路由配置,返回配置函数是 csrf_exempt(view),也就是禁用了csrf认证规则

      结论:所有继承APIView的子类,都不受csrf认证规则的限制

    2. 将请求处理的任务交给dispath方法完成

    重写dispatch方法

    完成了三大核心任务:

    1. 请求对象的处理:请求渲染模块
    2. 请求过程的处理:三大认证 = > 自己代码完成处理
    3. 请求结果的响应:异常模块处理异常响应 | 响应渲染模块处理正常响应

    请求解析、响应渲染、异常

    请求解析模块

    1. 二次封装了原生Django的wsgi协议的request对象,并做了向下兼容(原生request对象的内容,用现在的request对象都能访问)
    2. 将所有拼接参数都放在request.query_params中,将所有数据包参数都放在request,data中
    3. 路由的有名无名分组的数据还是保存在args和kwargs中

    解析模块可以在settings.py自定义解析配置

    REST_FRAMEWORK = {
        #解析模块
        'DEFAULT_PARSER_CLASSES':[
            'rest_framework.parsers.JSONParser',	#json
            'rest_framework.parsers.FormParser',	#urlencoded
            'rest_framework.parsers.MultiPartParser'	#form-data
        ],
        #渲染模块
        'DEFAULT_REDERER_CLASSES':[
            'rest_framework.renderers.JSONRenderer',
            'rest_framework.renderers.BrowsableAPIRenderer',	#上线后会注释
        ],
    }
    

    响应模块

    1. 当三大认证模块和自己处理请求的视图逻辑没有出现异常时,会执行响应渲染模块
    2. 响应的数据会交给渲染模块来完成数据的渲染,渲染方式有两种:Json格式数据渲染、Brower格式数据渲染

    渲染模块可以在settings.py自定义解析配置

    REST_FRAMEWORK = {
        #渲染模块
        'DEFFAULT_RENDERER_CLASSES':[
            'rest_framework.renderers.JSONRenderer',
            'rest_framework.renderers.BrwsableAPIRenderer'
        ],
    }
    

    序列化组件

    单表序列化

    models.py

    from django.db import models
    from django.conf import settings
    class User(mdoels.Model):
        SEX_CHOICE = ((0,'男')(1,'女'))
        name = models.CharField(max_length=64,verbose_name='姓名')
        password = models.CharFiled()
        afe = models.IntegerFiled(max_digits=5,decimal_places=2,default0)
        sex = mdoels.IntegerFiled(choices=SEX_CHOICES,default=0)
        #sex = models.CharFiled(choice=[('0','男'),('1','女')])
        icon models.ImageField(upload_to='icon',default='icon/default.png')
        #自定义序列化给前台的字段
        #优点:1)可以格式化数据库原有字段的数据,2)可以对外隐藏原有数据库字段名,3)可以直接连表操作
        @property	#制造插头
        def gender(self):
            return self.get_sex_display()
        @property
        def img(self):
            return settings.BASE_URL + settings.MEDTA_URL + self.icon.name
        def __str__(self):
            renturn self.name
    

    serializers.py

    from rest_framework import serializers
    from . import models
    class UserModelSerializer(serializers.ModelSerializer):
        class Meta:
            #该序列化类是辅助于那个Model类的
            model = model.User
            #设置参与序列化与反序列化字段
            #插拔式:可以选择性返回给前台字段(插头都是在Model类中制造)
            #fields = ['name','age','height','sex','icon']
            fields = ['name','age','height','gender','img']
    

    views.py

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from . import models,serializers
    calss UserAPIView(APIView):
        def get(self,request,*args,**kwaegs):
            pk = kwargs.get('pk')
            if pk:	#单查
                #1)数据库交互拿到资源obj或资源objs
                #2)数据序列化成为可以返回给前台的json数据
                #3)将json数据返回给前台
                obj = models.User.objects.get(pk=pk)
                serializer = serializers.UserModelSerializer(obj,many=False)
                return Response(serializer.data)
            else:	#群查
                #1)数据库交互拿到资源obj或资源objs
                #2) 数据序列化成为可以返回给前台的json数据
                #3)将json数据返回给前台
                querset = models.User.objects.all()
                # many操作的数据是否是多个
                serializer = serializers.User<odelSerializer(queryset,many=True)
                return Response(serializer.data)
         def post(self,request,*args,**kwargs):
            #单增
            #1)从请求request中获得前台提交数据
            #2)将数据转换成Model对象,并完成数据库入库操作
            #3)将入库成功的对象序列化可以返回给前台的json数据(请求与响应数据不对等:请求需要提交面膜,响应一定不展示密码
            #4)将json数据返回给前台
            return Response()
    
    我把月亮戳到天上 天就是我的 我把脚踩入地里 地就是我的 我亲吻你 你就是我的
  • 相关阅读:
    手撕 Goroutine 同步问题
    go基础知识面试备忘录
    专题3:链表类题型总结(go)
    python自动化开发-[第四天]-函数
    NOIP 飞扬的小鸟 题解
    集合 Properties 的 简单例子(Spring)
    Linux常用命令
    网络安全系列索引
    关于个人博客
    使用User Agent和代理IP隐藏身份
  • 原文地址:https://www.cnblogs.com/zhulipeng-1998/p/12863868.html
Copyright © 2020-2023  润新知