DRF之View和APIView

【零】DRF在Django项目中的使用

【1】导入

# DRF需要使用pip install 安装
pip install djangorestframework
  • DRF(Django Rest Framework)是一个用于构建 Web API 的工具包,它是基于 Django 框架的一个第三方应用(app)
  • 在 Django 项目中,一个应用(app)通常是一个具有特定功能的模块,它包含了模型、视图、模板等组件,用于实现特定的功能或业务逻辑。

image-20240415161036714

【2】使用

  • 使用drf时,需要先在settings.py文件中进行注册app
# settings.py
INSTALLED_APPS = [
    ...
    'rest_framework'
]

【一】View

  • restful规范所需5个接口
    • 查询所有
    • 添加
    • 查询单条数据
    • 更新单条
    • 删除单条

【1】基于Django的View实现5个接口

image-20240415163008511

  • 预处理请求数据的装饰器代码

image-20240415170227132

  • 【注】该版本如果使用post请求,需要注释掉csrf中间件

【2】基于DRF.APIView + Response实现5个接口

  • 使用Django自带的View我们可以发现,其对请求数据的处理不够完善

  • 而在DRF中,其帮我们处理了请求数据,能够让我们可以通过【request.data】直接获取到三种编码格式处理后的数据

  • 【request.data】中的数据可能为【querydict】或【dict】对象

  • 代码预览

image-20240415173532313

【2.1】APIView源码分析

  • 视图类调用时,就是执行【as_view()】方法
  • 【as_view()】就是我们查看APIView源码的入口
【2.1.1】DRF的APIView的as_view()

image-20240415194225740

【2.1.2】Django的View的as_view()

image-20240415194314096

【2.1.3】DRF的APIView的dispatch()

image-20240415194408065

【2.1.3.1】包装新的request

image-20240415194516764

  • Request类实例化对象的__init__方法

image-20240415194531177

【2.1.4】APIView的request对象
  • APIView的request对象相较于django的request对象多了一些属性
  • 常用的(以下的reuqest均为APIView的request对象)
    • request.data:获取请求体中的数据,以QueryDict形式或Dict形式返回
    • request.query_params:与django的request对象中的.GET方法一致

image-20240415194652037

  • 当获取APIView的request对象中没有的属性时,将会触发__getattr__方法

image-20240415194936756

【2.1.5】源码存疑的地方
  • 如果再调用self.__getattribute__获取属性,好像没有什么必要,肯定是会报错的,为什么要多做一个异常捕获,然后再抛出一个异常呀

image-20240415195047878

posted @ 2024-04-22 21:46  Lea4ning  阅读(44)  评论(0编辑  收藏  举报