DRF类 视图介绍

在DRF框架中提供了众多的通用视图基类和扩展类,用来简化视图的编写。

  • View:Django默认的视图基类,负责将视图连接到URL,HTTP请求的基本调度。

  • APIView: DRF提供的所有视图基类,继承View并扩展,具备了身份认证、权限检查、 流量控制等功能。

  • GenericAPIView :对APIView更高层次的封装,例如增加分页、过滤器

  • GenericViewSet:继承GenericAPIView和ViewSet

  • ViewSet:继承APIView,并结合router自动映射路由

  • ModelViewSet:继承GenericAPIView和五个扩展类,封装好各种请求,更加完善, 业务逻辑基本不用自己写了

APIView类

DRF提供的所有视图基类,继承View并扩展,具备了身份认证、权限检查、流量控制等功能

使用APIView类

 class UserView(APIView):def get(self, request):# print(request.query_params)queryset = User.objects.all()# 调用序列化器将queryset对象转为jsonuser_ser = UserSerializer(queryset, many=True)  # 如果序列化多条数据,需要指定many=Truereturn Response(user_ser.data)def post(self, request):print(request.data)data = {'result': 'post'}return Response(data)def put(self, request):data = {'result': 'put'}return Response(data)def delete(self, request):data = {'result': 'delete'}return Response(data)

GenericAPIView类

GenericAPIView对APIView更高层次的封装,实现以下功能:

  • 增加queryset属性,指定操作的数据,不用再将数据传给序列化器,自动实现

  • 增加serializer_class属性,指定使用的序列化器

  • 增加过滤器属性:filter_backends

  • 增加分页属性:pagination_class

  • 增加lookup_filed属性和实现get_object()方法:用于获取单条数据,可自定义默认分组名(pk)

使用GenericAPIView

 class UserView(GenericAPIView):queryset = User.objects.all()  # 指定操作的数据serializer_class = UserSerializer  # 指定序列化器lookup_field = 'id'  # 指定self.get_object()默认获取id的名称def get(self, request, id=None):if id:user_obj = self.get_object()  # 从零方法调用指定数据(默认根据pk作为id查询条件)user_ser = self.get_serializer(user_obj)else:queryset = self.get_queryset()  # 从类方法调用所有数据user_ser = self.get_serializer(queryset, many=True)  # 从类方法调用序列化器res = {'code': 200, 'msg': '成功', 'data': user_ser.data}return Response(res)def post(self, request):print(request.data)data = {'result': 'post'}return Response(data)def put(self, request):data = {'result': 'put'}return Response(data)def delete(self, request):data = {'result': 'delete'}return Response(data)

ViewSet类

ViewSet视图集不再实现get()、post()等方法,而是实现以下请求方法动作

• list():获取所有数据

• retrieve():获取单个数据

• create():创建数据

• update():更新数据

• destory():删除数据

使用

 class UserView(ViewSet):lookup_field = 'id'def retrieve(self, request, id=None):# 获取单用户obj = User.objects.get(id=id)# 调用序列化器将queryset对象转为jsonuser_ser = UserSerializer(obj)res = {'code': 200, 'msg': '成功', 'data': user_ser.data}return Response(res)def list(self, request):# 获取所有用户queryset = User.objects.all()# 调用序列化器将queryset对象转为jsonuser_ser = UserSerializer(queryset, many=True)  # 如果序列化多条数据,需要指定many=Trueres = {'code': 200, 'msg': '成功', 'data': user_ser.data}return Response(res)def create(self, request):# 调用序列化器将提交的数据进行反序列化user_ser = UserSerializer(data=request.data)  # request.data 用户POSTuser_ser.is_valid(raise_exception=True)user_ser.save()res = {'code': 200, 'msg': '创建用户成功!'}return Response(res)def update(self, request, id=None):data = {'result': 'put'}return Response(data)def destory(self, request, id=None):obj = User.objects.get(id=id)obj.delete()res = {'code': 200, 'msg': '删除用户成功!'}return Response(res

使用ViewSet类就不再需要为每一个API接口写对应的URL路由来绑定HTTP方法了,它会自动处理URL路由如下

from rest_framework import routers
from django.urls import include# 自动生成URL路由
router = routers.DefaultRouter()
router.register(r'user', views.UserView, basename='user') # 注册视图到路由urlpatterns += [path('api/', include(router.urls))  # URL根路径
]

ModelViewSet 类

ModelViewSet继承GenericAPIView和五个扩展类,封装好各种请求,更加完善,业务逻 辑基本不用自己写了,只需要指定serializer_class和queryset,就可以直接进行增删改查

from rest_framework.viewsets import  ModelViewSet
class UserView(ModelViewSet):queryset = User.objects.all()  # 指定操作的数据serializer_class = UserSerializer  # 指定序列化器

以上ModelViewSet虽然可以自动实现增删改查的功能,但是对于增改在一些场景下无法满足需求,这个时候就需要重写对应的方法

DRF常用功能

认证

主流认证方式:

  • Session(会话):客户端请求服务器端,服务端会为这次请求开辟一个内存空间,这个对象就是Session,是为了弥补HTTP无状态,服务端会利用session在客户端存储会话记录进行操作

  • Token(令牌):用来验证用户身份的凭证,是uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,以哈希算法压缩成一定长的十六进制字符串)

  • JWT:与普通Token一样,都是访问资源的令牌

三种认证方式的工作流程图

Session:

Token:

JWT:一帮Token服务端验证token信息要查询数据库验证,JWT验 证token信息不用查询数据库,只需要在服务端使用密 钥效验

cookie 和 session 的区别
  • 存储方式:cookie 数据存放在客户的浏览器上,session 数据放在服务器上;

  • 安全性:cookie 是本地存储,不是很安全,别人可以分析存放在本地的 cookie 并进行欺骗;

  • 存储大小:很多浏览器限制单个 cookie 保存的数据不能超过4K,一个站点最多保存20个cookie,session 没有类似的限制;

  • 生存周期:cookie 可设置为长时间保持,Session 一般失效时间较短,一般客户端关闭 session 就会失效

DRF 四种认证方式与权限

• BasicAuthentication:基于用户名和密码的认证,适用于测试 • SessionAuthentication:基于Session的认证 • TokenAuthentication:基于Token的认证 • RemoteUserAuthentication:基于远程用户的认证 DRF支持权限: • IsAuthenticated:只有登录用户才能访问所有API • AllowAny:允许所有用户 • IsAdminUser:仅管理员用户 • IsAuthenticatedOrReadOnly:登录的用户可以读写API,未登录用户只读

Session认证配置

1 在settings.py所有视图(全局)启用认证:

# DRF配置
REST_FRAMEWORK = {
# 认证'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',],
# 权限'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
}

2 视图级别设置

from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.viewsets import  ModelViewSet
class UserView(ModelViewSet):queryset = User.objects.all()  # 指定操作的数据serializer_class = UserSerializer  # 指定序列化器authentication_classes = [SessionAuthentication]permission_classes = [IsAuthenticated]
Token 认证配置

1 安装

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','rest_framework','myapp','myapp_api','Association_table','rest_framework.authtoken' #token认证
]

2 启用Token认证

REST_FRAMEWORK = {# 认证'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework.authentication.TokenAuthentication',],# 权限'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.IsAuthenticated',],
}

3 生成数据库表

python manage.py migrate

4 、配置Token认证接口URL

限流

过滤

搜索与排序

分页

自动生成接口文档

Django DRF 视图和常用功能相关推荐

  1. Django + DRF + Elasticsearch 实现搜索功能

    django使用haystack来调用Elasticsearch搜索引擎 如何使用django来调用Elasticsearch实现全文的搜索 Haystack为Django提供了模块化的搜索.它的特点 ...

  2. 快速上手Django(六) -Django之Django drf 序列化器Serializer类

    文章目录 快速上手Django(六) -Django之Django drf 序列化器Serializer类 1. 背景 2. 使用思路 3. 代码demo 4. [重要]序列化类 ModelSeria ...

  3. Django Rest Framewor的常用组件

    DRF框架中常用的组件 为了方便接下来的学习,我们创建一个新的子应用 opt python manage.py startapp opt 提前在总路由和配置文件中注册子应用和配置总路由. # sett ...

  4. Django的视图层简介

    Django的视图层 视图函数 所谓视图函数,其实就是我们Django项目中各个应用中的views.py文件中定义的每个用来处理URL路由映射到这里的逻辑函数.一个视图函数简称视图,它是个简单的Pyt ...

  5. Django 基础(13)-Django drf 序列化器类to_representation和to_internal_value(处理返回的日期格式)、序列化类 ModelSerializer

    文章目录 一.Django drf 序列化 1. 背景 2. 使用思路 3. 代码demo 4. [重要]序列化类 ModelSerializer 5. DRF序列化器to_representatio ...

  6. Django 基础(12)-Django drf 分页查询(批量查询)、自定义分页器

    文章目录 Django drf 分页查询(批量查询) PageNumberPagination:普通分页 Django 自定义分页器 自定义批量查询的返回结构 LimitOffsetPaginatio ...

  7. Django DRF API

    Django 基本使用 前后端分离开发模式 1.1 前后端分离前 1.2 前后端分离前存在的一些问题 • PC.APP.Pad等多端流行 • 前后端开发职责不清晰:各司其职,最大程度减少开发难度,方便 ...

  8. Drf从入门到精通四(Drf请求与响应、Drf能够解析的请求编码与响应编码、Drf视图、Drf视图基类)

    文章目录 一.Drf请求与响应 1.Request类和Response类 2.Drf能够解析的请求编码与相应编码 二.Drf视图组件 四.Drf视图基类 1.基于APIView写5个接口 2.基于Ge ...

  9. django自带的分页功能

    django自带的分页功能 django中自带的分页功能有缺陷,但是也是一种思路,所以在下做一个整理,方便以后使用,还有服务各位小伙伴. django视图部分的代码.(注释才是重点) from dja ...

最新文章

  1. JAVA入门到精通-第71讲-学生管理系统3-增删改查
  2. Serverless那么火,2019年的采用如何?
  3. 基于Tablestore的Wifi设备监管系统架构实现
  4. php 框架效率测试,2017 非标准 PHP 框架性能测试比较
  5. ORACLE 11GR2 RAC new features 新特性。
  6. Filecoin Gas基础费率降至4.67 nanoFIL
  7. 今天可免费用VR观看第51届超级碗大赛直播
  8. 【图神经网络】从源头探讨 GCN 的行文思路
  9. keras读取训练好的模型参数并把参数赋值给其它模型
  10. 190304每日一句
  11. (二)4.逻辑函数的化简
  12. Java常用代码汇总(经典代码)
  13. 用计算机求正有理数算术平方根的步骤,用计算器求算术平方根、用有理数估计算术平方根的大小.doc...
  14. 简单五子棋游戏c语言简单,C语言制作简单五子棋游戏
  15. 带节日和农历的js日历
  16. 人工智能的创业方向到底怎么选?
  17. YOLOV3在windwos下的配置和训练过程简述
  18. Swiper实现两种常用轮播图
  19. Backbone入门指南(二):依赖库Underscore
  20. Java 之父Oracle

热门文章

  1. docker下载镜像并导入到生产系统
  2. Flutter ValueNotifier错误用法 插眼
  3. 微信直播如何变现呢?这里有3种方式
  4. Python 调用163邮箱发送邮件
  5. Kernel-based Hough transform (KHT)移植
  6. 荷兰 转专业 计算机,关于荷兰留学转专业的那些事
  7. ESP8266-Arduino编程实例-ULN2003步进电机驱动
  8. ABB机器人系统输入输出信号System Input和Output详解(二)
  9. go语言之JSON序列化
  10. 取缔余额宝 是高估了余额宝还是低估了银行