Django DRF 视图和常用功能
DRF类 视图介绍
在DRF框架中提供了众多的通用视图基类和扩展类,用来简化视图的编写。
![](/assets/blank.gif)
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 类
![](/assets/blank.gif)
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:
![](/assets/blank.gif)
Token:
![](/assets/blank.gif)
JWT:一帮Token服务端验证token信息要查询数据库验证,JWT验 证token信息不用查询数据库,只需要在服务端使用密 钥效验
![](/assets/blank.gif)
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 视图和常用功能相关推荐
- Django + DRF + Elasticsearch 实现搜索功能
django使用haystack来调用Elasticsearch搜索引擎 如何使用django来调用Elasticsearch实现全文的搜索 Haystack为Django提供了模块化的搜索.它的特点 ...
- 快速上手Django(六) -Django之Django drf 序列化器Serializer类
文章目录 快速上手Django(六) -Django之Django drf 序列化器Serializer类 1. 背景 2. 使用思路 3. 代码demo 4. [重要]序列化类 ModelSeria ...
- Django Rest Framewor的常用组件
DRF框架中常用的组件 为了方便接下来的学习,我们创建一个新的子应用 opt python manage.py startapp opt 提前在总路由和配置文件中注册子应用和配置总路由. # sett ...
- Django的视图层简介
Django的视图层 视图函数 所谓视图函数,其实就是我们Django项目中各个应用中的views.py文件中定义的每个用来处理URL路由映射到这里的逻辑函数.一个视图函数简称视图,它是个简单的Pyt ...
- Django 基础(13)-Django drf 序列化器类to_representation和to_internal_value(处理返回的日期格式)、序列化类 ModelSerializer
文章目录 一.Django drf 序列化 1. 背景 2. 使用思路 3. 代码demo 4. [重要]序列化类 ModelSerializer 5. DRF序列化器to_representatio ...
- Django 基础(12)-Django drf 分页查询(批量查询)、自定义分页器
文章目录 Django drf 分页查询(批量查询) PageNumberPagination:普通分页 Django 自定义分页器 自定义批量查询的返回结构 LimitOffsetPaginatio ...
- Django DRF API
Django 基本使用 前后端分离开发模式 1.1 前后端分离前 1.2 前后端分离前存在的一些问题 • PC.APP.Pad等多端流行 • 前后端开发职责不清晰:各司其职,最大程度减少开发难度,方便 ...
- Drf从入门到精通四(Drf请求与响应、Drf能够解析的请求编码与响应编码、Drf视图、Drf视图基类)
文章目录 一.Drf请求与响应 1.Request类和Response类 2.Drf能够解析的请求编码与相应编码 二.Drf视图组件 四.Drf视图基类 1.基于APIView写5个接口 2.基于Ge ...
- django自带的分页功能
django自带的分页功能 django中自带的分页功能有缺陷,但是也是一种思路,所以在下做一个整理,方便以后使用,还有服务各位小伙伴. django视图部分的代码.(注释才是重点) from dja ...
最新文章
- JAVA入门到精通-第71讲-学生管理系统3-增删改查
- Serverless那么火,2019年的采用如何?
- 基于Tablestore的Wifi设备监管系统架构实现
- php 框架效率测试,2017 非标准 PHP 框架性能测试比较
- ORACLE 11GR2 RAC new features 新特性。
- Filecoin Gas基础费率降至4.67 nanoFIL
- 今天可免费用VR观看第51届超级碗大赛直播
- 【图神经网络】从源头探讨 GCN 的行文思路
- keras读取训练好的模型参数并把参数赋值给其它模型
- 190304每日一句
- (二)4.逻辑函数的化简
- Java常用代码汇总(经典代码)
- 用计算机求正有理数算术平方根的步骤,用计算器求算术平方根、用有理数估计算术平方根的大小.doc...
- 简单五子棋游戏c语言简单,C语言制作简单五子棋游戏
- 带节日和农历的js日历
- 人工智能的创业方向到底怎么选?
- YOLOV3在windwos下的配置和训练过程简述
- Swiper实现两种常用轮播图
- Backbone入门指南(二):依赖库Underscore
- Java 之父Oracle