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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DRF(Django Rest Framework)是一种用于构建Web API的强大框架,它提供了丰富的功能和工具来简化API的开发过程。在使用DRF时,我们经常需要定义视图和序列化器以及它们之间的关系来处理不同的请求和操作。 DRF请求处理基于视图的操作方法,它们分别对应于HTTP方法,例如GET,POST,PUT,PATCH和DELETE。这些操作方法在视图中以函数的形式定义,并且通过装饰器或路由来映射到相应的URL。 序列化器是DRF的一个核心概念,它提供了一种简单而灵活的方式,将数据对象转换为可以被序列化和反序列化的格式,通常是JSON或XML。序列化器可以定义在视图中,也可以单独定义为一个类,然后在视图中使用。 在DRF中,我们可以通过定义不同的序列化器类来处理不同的操作。序列化器类可以继承自DRF提供的Serializer类或ModelSerializer类,后者自动为我们根据模型生成序列化器字段。 使用序列化器,我们可以在视图中方便地对请求进行验证、数据转换和结果序列化等操作。在视图的操作方法中,我们可以通过调用序列化器的不同方法来进行这些操作。 例如,我们可以使用序列化器的`is_valid()`方法来验证请求的数据是否有效。我们还可以使用`save()`方法来保存数据,或者使用`data`属性来获取序列化后的数据。此外,我们还可以通过调用`serializer_class()`方法来获取当前视图使用的序列化器类。 总之,DRF的action序列化提供了一种方便而强大的方式来处理API的请求和操作。通过定义视图和序列化器,并将它们联系起来,我们可以在开发API时更加高效和灵活。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值