推广 热搜: 行业  机械  设备    系统  教师    参数  经纪  蒸汽 

[学习笔记]3小时搞定DRF框架 | Django REST framework前后端分离框架实践

   日期:2025-01-03     移动:http://sjzytwl.xhstdz.com/mobile/quote/86779.html

DRF(全称Django REST framework)是一个用于构建 Web API 的强力工具集,是一个基于Django的Python Web框架,它为开发人员提供了一套快速开发 RESTful API 的工具,它能够自动化 API 可视化、文档化,实现接口的自动化测试以及自动化的API路由、序列化、视图、验证、分页、版本管理、认证等等功能。DRF简化了API的开发,并提供了一系列的工具来构建高质量的API。

  • Settings.py
 
  • manage.py
 
 
 

django rest framework官网:https://www.django-rest-framework.org/

按照文档执行下面步骤

  • 1.安装相应包
 
  • 在settings.py中修改配置
 

对于rest framework所有相关配置都放在settings的一个字典里面

 
  • 在urls.py中修改配置
 
  • DRF的20个模块
    序列化、视图、路由、认证、权限、限流、过滤、解析器、渲染器、分页、版本、测试、概要、异常处理、配置、验证、状态码、内容协商、缓存、元数据

models.py

 

将字段注册到后台,方便从admin后台添加数据
admin.py

 
 

序列化也叫序列化器,是指把查询集QuerySet或者模型类实例instance这种django的数据类型转化为json或者xml
把queryset或者instance转化为方便前端可以轻松渲染的json/xml/yaml
所以序列化和反序列化是为了前后端数据交互
深度剖析 Django 的 serializer

  • 在python console中测试django的序列化器

 

但django的序列化器还有很多需要完善的地方
1.验证处理:在反序列化的过程中,当前端传递过来的数据放在request.data里时,要转化为模型类实例,然后保存。这时需要对前端提交的数据进行验证。
2.验证器的参数
3.同时序列化多个对象
4.序列化的过程中添加上下文
5.没有对无效的数据异常处理
6.关系型字段的外键字段只返回了id,需要我们自己处理关系型字段
drf的序列化器可以帮我们很好的解决这些问题。

Python学习————序列化器(复习
在应用下建一个serializes.py
模型类的序列化的写法和django开发时form的写法非常类似
先回顾给模型类建form表单类

 

模型类序列化的写法几乎一样,只是继承自serializers.ModelSerializer
teacher是外键,所以想得到讲师对应的名字,需要把用户的名称序列化出来。
teacher关联到的用户表,并不是新建课程时新建一个用户,所以该字段可以设为只读ReadOnlyField

 

同样方法序列化用户模型类
ModelSerializer是更高一级的封装,它继承自Serializer,要实现比较灵活的自定义,可以继承自Serializer
我们这里只序列化模型类,比较简单,所以可以直接用

 

对外键字段的序列化,可以指定遍历的深度
如果表结构有子表关联到父表,父表又关联到另外的父表,就可以设置深度

 
 

假设请求课程信息时,希望每条课程信息的记录,都能跳转到详情页

DRF相关的配置,都写在settings.py中的REST_frameWORK的字典中
继承自HyperlinkedModelSerializer
fields里加上url
url是默认值,如果要改成其他名称,如“link”,可在settings.py中设置URL_FIELD_NAME使全局生效

settings.py

 

serializers.py

 
 

通过DRF使用四种不同的方式来Restful API接口

  • 函数式编程
  • 类视图
  • 通用类视图
  • DRF的视图集

在views.py文件中

4.1.1 Django原生的view-函数式编程编写API接口

思路就是判断这个是什么方法,然后进行处理

 

需要注意:post请求,需要使用装饰器来解除csrf限制

4.1.2 Django原生的view-类视图编程编写API接口

CBV的编写思路是对不同的请求方法用对应的函数处理

 

可以导入方法装饰器,装饰的方法是是dispatch,因为根据django的请求响应原理,当request请求来的时候,它首先到达dispatch方法,通过dispatch方法处理后,再找到post方法

上面的两种方式,是直接使用原生的Django写接口,有很多东西都需要自己从零开始实现。
比如分页、排序、认证、权限、限流等等
于是就有了DRF的视图,集成了这些接口开发常用的功能

4.2.1 实现“获取所有课程信息或新增一个课程”的接口

  • 新建drf的fbv视图
 

函数式编程会用到装饰器
partial=True表示部分更新

  • 新建路由

为了方便管理course这个app下的路由,在course这个应用下创建一个urls.py文件,然后通过include包含到项目的urls中
django urls include用法

course/urls.py

 

drf_tutorial/urls.py

 
 

先不用HyperlinkedModelSerializer的api了,因为HyperlinkedModelSerializer是高度集成的序列化类,后面使用drf的视图集来编程可以用。所以序列化类改用

认证方式

  • basic auth认证:账户名、密码认证

  • OAuth 2.0等

  • 实现接口
 
  • 实现路由

导入generics

 

4.5.1 实现查看和请求新增的接口

通用类视图,实际上是把一些常见的增删改查操作对应的类通过mixin把他混合在一起。
这里属性的名称是固定的
这里需要重载perform_create方法

4.5.2 实现课程详情的接口

  • 实现通用类视图

下面的写法等价于
不过对于下面的方法,请求的方法不再是GET、PUT、PATCH、DELETE,而是retrieve,update,destory等,所以还是建议用

 
  • 新增路由
  • 导入viewsets
 
  • 创建视图集
 

不做权限认证只需要四行代码

  • 新增路由

写法和前面不一样
两种视图集的路由写法

    • 1 传统写法
 
    • 2.DRF的路由routers
  • 导入

也可以实现自定义的认证方案,或者使用第三方的包,比如json webtoken(关于jwt的认证,会在接下来的drf进阶实战课程讲解
认证和权限的区别
认证是对用户登录的身份进行校验
权限指的是一个登录验证通过的用户,他能够访问哪些接口;或者对于某一个接口,他能够拿到什么级别的数据
根据Django restframework对http request的响应流程来看,身份认证是发生在权限检查和限流检查之前的

认证和权限,核心依赖两个数据:request.user, request.auth
认证机制实际上依赖的是Django的auth框架


中的多个认证类,DRF会按顺序从上往下对每个类进行认证。并使用第一个成功通过的认证类来返回值,来设置request.user和request.auth

5.1.1 BasicAuthentication

设置basicauthentication,则headers会多一个authorization,它是用户名密码经过base64库计算出来的密文,这是postman自动完成的。base64库不具有机密性,是可以解密的。所以basicauthentication一般用于测试工作,不用于生产环境

  • 测试,通过basicauthentication认证后,request.user和request.auth返回什么

5.1.2 SessionAuthentication

使用的是Django默认的会话后端,通常在前端js里使用http,ajax请求时可以使用session认证,使用这个时,需要给后端提供csrf令牌的。

5.1.3 TokenAuthentication

是一种简单的,基于令牌的http认证方式

  • 在settings.py的INSTALLED_APPS加上

会生成一张数据表

 
  • 生成token的方式
5.1.3.1 使用Django manag.py生成Token

只能供管理员测试
手动生成token

 
 
5.1.3.2 使用Django的信号机制生成Token

目的
自动生成token
用户可以通过接口请求到token

view.py中

 

也可以直接导入django的user模型类作为认证模型类
原理:当User模型类新建一个实例并把并保存的时候,即新建一个用户的时候,因为保存要调用save方法
保存之后,post_save信号会传递给receiver,receiver接受之后,就会执行函数generate_token
执行函数时,instance是指新建的用户实例,created=True,于是在authtoken_token表中生成一条记录

给用户生成的token,用户如何获取到呢

rest_framework已经帮我们写好了,我们直接调用即可

在总的路由urls.py中

    • 1.对函数式编程
      导入对于认证的装饰类
 

装饰器是有顺序的

对象上只添加密码认证的类装饰器

    • 2.对类视图编程
      直接加入类属性
 

通用类视图、视图集也是一样的,也都有类属性

常用的权限类有哪些?应该如何设置权限策略?如何自定义对象级别权限

DRF的权限都是在permissions模块里面,权限检查的过程和前面讲解的身份认证一样,也是会使用request.user和request.auth属性中的身份认证信息来决定请求是否传入。、

5.3.1 在settings.py中可以设置全局的权限类

  • 常用权限类有

IsAuthenticatedOrReadOnly: 登录的用户可以增删改查,不登陆的用户可以查询
IsAuthenticated:只有登录的用户可以进行所有操作,不登陆的用户不能进行所有操作,get也不行
IsAdminUser:admin用户有权限访问接口,是不是admin是看auth_user表的is_staff字段,true表示是admin级别用户
AllowAny:允许所有请求

5.3.2 如何在接口上/对象级别设置权限

  • 导入装饰器
 
  • 导入权限类
 
5.3.2.1 给函数视图设置权限
  • 给函数视图加上装饰器
 
5.3.2.2 给类视图/通用类视图/视图集设置权限
  • 直接加入类属性
 

5.3.3 如何自定义对象级别权限

实现只能修改自己的信息,别人的信息只可以查看,不能修改。

  • 在应用下面建立permission.py,并创建自定义的权限类
    permission.py
 

重写方法
安全的方法可以用代替

  • 将创好的自定义权限类导入视图
  • 1.在settings.py的REST_frameWORK中加入
 
  • 2.在总的urls.py中添加路由
    先导入get_schema_view
    再创建get_schema_view实例
    再创建路由

但是文档还是不够美观,下一节介绍使用coreapi的概要功能


特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


0相关评论
相关最新动态
推荐最新动态
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号