drf框架 2 drf框架的请求生命周期(as_view和dispatch方法), 请求解析渲染响应异常, 序列化组件 ,ORM配置回顾(media文件配置),应用在settings.py中(代码片

Posted 战斗小人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了drf框架 2 drf框架的请求生命周期(as_view和dispatch方法), 请求解析渲染响应异常, 序列化组件 ,ORM配置回顾(media文件配置),应用在settings.py中(代码片相关的知识,希望对你有一定的参考价值。

应用是否需要在INSTALLED_APPS中注册

\'\'\'    
        在没有使用到app的一些特殊操作时(比如数据库相关),不需要app的__init__文件注册时,文件夹可以不用注册,但是注册后,应用的所有功能都能使用
    结论:所有应用都可以完成注册
\'\'\'

 

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

import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
    \'default\': {
        \'ENGINE\': \'django.db.backends.mysql\',
        \'NAME\': \'数据库名\',
        \'USER\': \'账号\',
        \'PASSWORD\': \'密码\',
        #\'HOST\': \'如果是127.0.0.1,该配置可以省略\',
        "PORT": 3306,  # 如果是3306,该配置可以省略
    }
}

 

ORM配置回顾

media文件配置

# models.py
from django.db import models
class User(models.Model):
    SEX_CHOICES = ((0, \'\'), (1, \'\'))
    name = models.CharField(max_length=64, verbose_name=\'姓名\')
    age = models.IntegerField()
    height = models.DecimalField(max_digits=5, decimal_places=2, default=0)
    sex = models.IntegerField(choices=SEX_CHOICES, default=0)
    # sex = models.CharField(choices=[(\'0\', \'男\'), (\'1\', \'女\')])
    icon = models.ImageField(upload_to=\'icon\', default=\'icon/default.png\')
    
    
# settings.py
# root就是将文件夹添加到 os.path 中    用户上传的文件就会全部保存在该文件夹下
MEDIA_ROOT = os.path.join(BASE_DIR, \'media\')
# url就是配置路由 /路由名/
MEDIA_URL = \'/media/\'

# 主路由上面导入
from django.views.static import serve
from django.conf import settings
# 主路由最下方  暴露任意后端资源配置
url(r\'^media/(?P<path>.*)\', serve, {\'document_root\': settings.MEDIA_ROOT})

 

APIView的请求声明周期

重写的as_view方法

"""
1)as_view方法完成路由配置,返回配置函数是 csrf_exempt(view),也就是禁用了csrf认证规则   # 如果原生django框架下不禁用,postman发送post请求会被禁掉,get请求不会
结论:所有继承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_RENDERER_CLASSES\': [
        \'rest_framework.renderers.JSONRenderer\',
        \'rest_framework.renderers.BrowsableAPIRenderer\',  # 上线后会注释,用浏览器方式的渲染。上线如果不注释,别人能看到后端使用drf,用响应方式攻击
    ],
}

例子:

from rest_framework.views import APIView
from rest_framework.response import Response

from . import models,serializers

# APIView生命周期知识点
class UserAPIView(APIView):
    def get(self,request,*args,**kwargs):
        return Response(\'get ok\')

    # 处理请求
    def post(self,request,*args,**kwargs):
        # 向下兼容:原来对象拥有,现在对象都运用
        # print(type(request))    # drf的
        # print(type(request._request))   # django原生wsgi的

        # print(request.GET)
        # 拼接参数
        print(request.query_params)

        # print(request.POST)
        # 数据包参数
        print(request.data)

        return Response({
            \'status\':0,
            \'msg\':\'ok\',
            \'results\':\'post success\'
        })
        
View Code

 

响应渲染模块

"""
1)当三大认证模块和自己处理请求的视图逻辑没有出现异常时,会执行响应渲染模块

2)响应的数据会交给渲染模块来完成数据的渲染,渲染方式有两种:Json格式数据渲染、Brower格式数据渲染
"""
# 渲染模块可以在settings.py自定义解析配置
REST_FRAMEWORK = {
    # 渲染模块
    \'DEFAULT_RENDERER_CLASSES\': [
        \'rest_framework.renderers.JSONRenderer\',
        # 浏览器渲染,上线后会注释,不然浏览器请求接口就暴露了后台语言
        \'rest_framework.renderers.BrowsableAPIRenderer\',  # 用浏览器页面方式的渲染,可以测试,用该页面做post请求
    ],
}

 对应效果代码:

from rest_framework.views import APIView
from rest_framework.response import Response
class UserAPIView(APIView):
    def post(self, request, *args, **kwargs):
        return Response({
            \'status\': 0,
            \'msg\': \'ok\',
            \'results\': \'post success\'
        })
View Code

 

序列化组件

单表序列化(后台数据返回给前台)

models.py
from django.db import models
from django.conf import settings
class User(models.Model):
    SEX_CHOICES = ((0, \'\'), (1, \'\'))
    name = models.CharField(max_length=64, verbose_name=\'姓名\')
    password = models.CharField(max_length=64)
    age = models.IntegerField()
    height = models.DecimalField(max_digits=5, decimal_places=2, default=0)
    sex = models.IntegerField(choices=SEX_CHOICES, default=0)
    # sex = models.CharField(choices=[(\'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.MEDIA_URL + self.icon.name

    def __str__(self):
        return self.name

 

serializers.py

from rest_framework import serializers
from . import models
class UserModelSerializer(serializers.ModelSerializer):
    class Meta:
        # 该序列化类是辅助于那个Model类的
        model = models.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

class UserAPIView(APIView):
    def get(self, request, *args, **kwargs):
        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数据返回给前台
            queryset = models.User.objects.all()
            # many操作的数据是否是多个
            serializer = serializers.UserModelSerializer(queryset, many=True)
            return Response(serializer.data)

    def post(self, request, *args, **kwargs):
        # 单增
        # 1)从请求request中获得前台提交的数据
        # 2)将数据转换成Model对象,并完成数据库入库操作
        # 3)将入库成功的对象列化成可以返回给前台的json数据(请求与响应数据不对等:请求需要提交密码,响应一定不展示密码)
        # 4)将json数据返回给前台

        return Response()

 

小结

"""
0)回顾Django及ORM

1)APIView的生命周期
禁用csrf(√) => 请求解析模块(√) => 三大认证模块 => 自己代码处理请求 => 异常响应|正常响应渲染模块(√)

2)单表序列化:ModelSerializer
"""

 

以上是关于drf框架 2 drf框架的请求生命周期(as_view和dispatch方法), 请求解析渲染响应异常, 序列化组件 ,ORM配置回顾(media文件配置),应用在settings.py中(代码片的主要内容,如果未能解决你的问题,请参考以下文章

drf框架 ----- 接口 cbv生命周期 请求解析响应组件 序列化组件 三大认证 其他组件

drf之框架基础

DRF框架知识总览

drf框架

DRF框架

drf 框架