drf之--认证组件、权限组件(django项目国际化)、频率组件、排序

视图集回顾

# 1 9 个视图子类-GenericAPIView+5个视图扩展类的组合-ListAPIView,CreateAPIView,DestroyAPIView,RetrieveAPIView,UpdateAPIView-ListCreateAPIView-RetrieveDestroyAPIView,RetrieveUpdateAPIView,RetrieveUpdateDestroyAPIView-class TestView(ListAPIView):querysetserializer_calss# 2 视图集-ModelViewSet:GenericViewSet+5个视图扩展类-路由写法变了的5个接口-PublishView.as_view({'get':'list','post':'create'})-自动生成路由:本质:把get和list对应,把post和create对应-可以重写父类方法,完成自己的定制-ReadOnlyModelViewSet:2个接口,只读的-ViewSet:ViewSetMixin+APIView-GenericViewSet:ViewSetMixin+GenericAPIView-ViewSetMixin:重写了as_view 路由写法变了
#  3 drf路由,继承ViewSetMixin+APIViewViewSetMixin+ListAPIView---》自动生成路由-自动生成路由步骤-action装饰器---/publish/被装饰函数名字/    post请求就会执行- @action(methods=['POST'], detail=False)
# 4 视图类对象中:self.action  路由匹配成功,执行视图类中方法的名字的字符串# 补充:
# 如果自动生成路由,哪个请求能执行这个list?路由匹配成功后的get请求,就会执行这个list,自动生成的
class TestView(GenericViewSet):def list(self, request):return Response('sdafs')

1 认证组件

1.1 登录功能

# 写登录的时候,可以使用auth提供的user表,也可以自定义---》自定义# 写登录接口,登录成功,要有标志,生成一个随机字符串,放到表中,以后它只要带着这个随机字符串过来,我们就认为是这个人登录的
### ### ### ### ### ### ### 视图类### ### ### ### ### ### ### ### ### ### ### ### ###from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
from rest_framework.viewsets import ViewSetMixin, ViewSet
from rest_framework.response import Response
from rest_framework.decorators import action
from .models import User, UserToken
import uuid# class UserView(ViewSetMixin,APIView):
class UserView(ViewSet):@action(methods=['POST'], detail=False) # /user/login/    post 请求就会执行def login(self, request, *args, **kwargs):# 前端传入用户名密码username = request.data.get('username')password = request.data.get('password')user = User.objects.filter(username=username, password=password).first()if user:# 生成一个随机字符串,返回给前端,并且要把随机字符串存到token表中# 随机字符串使用uuid生成token = str(uuid.uuid4())# 把随机字符串存到token表中会有两种情况(如果之前没有登录过就是新增,如果之前登录过修改)# 先去UserToken表中,根据user查,如果能查到,就修改,查不到就新增一条记录##### 方式一:麻烦方式# user_token=UserToken.objects.filter(user=user).first()# if user_token:#     user_token.token=token#     user_token.save()# else:#     UserToken.objects.create(user=user,token=token)## 方式二:通过user去UserToken表中查,如果能查到用defaults的更新,如果查不到,就用user和defaults新增一条记录UserToken.objects.update_or_create(defaults={'token': token}, user=user)return Response({'code': 100, 'msg': '登录成功', 'token': token, 'username': user.username})else:return Response({'code': 101, 'msg': '用户名或密码错误'})### ### ### ### ### ### ### 路由### ### ### ### 
from rest_framework.routers import SimpleRouterrouter = SimpleRouter()
router.register('user', UserView, 'user')urlpatterns = [path('admin/', admin.site.urls),path('', include(router.urls)),
]

1.2 认证组件

# 认证有什么作用?-一些接口,想限制登录后才能访问,没登录不能访问-做登录认证,限制如果没登录,不允许访问该接口# drf中,认证类如何使用# 1 写一个类,继承BaseAuthentication#  2 类中重写 :authenticate方法# 3 在authenticate完成登录认证,如果登录了,返回两个值,如果没登录抛异常# 4 在视图类中配置使用class BookView(ViewSet):authentication_classes = [LoginAuth]# 如果登录了,在视图类的方法中,能拿出当前登录用户request.user

1.2.1 auth.py

from .models import UserToken# 按照如下步骤写
# 1 写一个类,继承BaseAuthentication
# 2 类中重写 :authenticate方法
# 3 在authenticate完成登录认证,如果登录了,返回两个值,如果没登录抛异常
# 4 在视图类中配置使用from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailedclass LoginAuth(BaseAuthentication):def authenticate(self, request):# 如何知道当前请求这个人是登录了?# 拿到前端传入的token:当时给的随机字符串---》去UserToken表中查,如果能查到,说明就是这个人在访问,如果查不到,说明这个人没有登录过# 前端传入的token,从哪拿?如何拿?---》后端定的:1 请求地址中  2 请求体中  3 请求头中token = request.query_params.get('token')user_token = UserToken.objects.filter(token=token).first()if user_token:  # 是登录状态return user_token.user, token  # 返回两个值,第一个是当前登录用户,第二个是前端tokenelse:raise AuthenticationFailed('您没有登录')

1.2.2 视图类

from django.shortcuts import render# Create your views here.# 路由自动生成吗?    自动生成继承:ViewSetMixin   我想
# 要不要序列化,要不要跟数据库打交道,继承GenericAPIView:查出所有数据(只要一条),还要写个序列化类()
from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
from rest_framework.viewsets import ViewSetMixin, ViewSet
from rest_framework.response import Response
from rest_framework.decorators import action
from .models import User, UserToken
import uuidfrom .auth import LoginAuth# class UserView(ViewSetMixin,APIView):
class UserView(ViewSet):@action(methods=['POST'], detail=False)  # /user/login/    post 请求就会执行def login(self, request, *args, **kwargs):# 前端传入用户名密码username = request.data.get('username')password = request.data.get('password')user = User.objects.filter(username=username, password=password).first()if user:# 生成一个随机字符串,返回给前端,并且要把随机字符串存到token表中# 随机字符串使用uuid生成token = str(uuid.uuid4())# 把随机字符串存到token表中会有两种情况(如果之前没有登录过就是新增,如果之前登录过修改)# 先去UserToken表中,根据user查,如果能查到,就修改,查不到就新增一条记录##### 方式一:麻烦方式# user_token=UserToken.objects.filter(user=user).first()# if user_token:#     user_token.token=token#     user_token.save()# else:#     UserToken.objects.create(user=user,token=token)## 方式二:通过user去UserToken表中查,如果能查到用defaults的更新,如果查不到,就用user和defaults新增一条记录UserToken.objects.update_or_create(defaults={'token': token}, user=user)return Response({'code': 100, 'msg': '登录成功', 'token': token, 'username': user.username})else:return Response({'code': 101, 'msg': '用户名或密码错误'})class BookView(ViewSet):authentication_classes = [LoginAuth]  # 这个认证类,管理了当前类下所有的方法def list(self, request):print(request.user.username)  # 当前登录用户return Response("你好:%s,你看到了好多书啊"%request.user.username)

1.2.3 路由

from rest_framework.routers import SimpleRouterrouter = SimpleRouter()
router.register('user', UserView, 'user')
router.register('books', BookView, 'books')
urlpatterns = [path('', include(router.urls)),
]

1.3 小结

# 1 认证类写好,使用-配置在视图类上---》局部使用-配置文件中配置--》全局使用---》所有接口都必须登录后才能用REST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES': ['app01.auth.LoginAuth'],}-局部禁用:class UserView(ViewSet):authentication_classes = []
# 2 写的认证类:要重写authenticate方法,必须返回两个参数:当前登录用户:user_token.user,用户的 token----》后续再视图类中:request.user  就是认证类返回的第一个参数,request.auth 就是认证类返回的第二个参数# 3 如果认证失败,抛异常AuthenticationFailed,会被drf捕获,处理,不会报错到前端# 4 前端传入的token,从哪取?-后端定的,我们这个项目是从请求地址中取-还可以从请求头或请求体中取
# 5 UserToken.objects.update_or_create

2 权限组件

# 系统中:有普通用户,超级用户,超级管理员,他们都登录了,又分权限,有的人有权限,就能访问这个接口,没权限,就不能访问# 使用步骤:
# 1 写一个类,继承 BasePermission
# 2 重写 has_permission
# 3 在方法中校验用户是否有权限,如果有,就返回True,如果没有,就返回False-由于它的执行是在认证之后,所有从request.user中取出当前等用户,判断权限
# 4 在视图类中局部使用,在settings中全局使用,局部可以禁用class PublishView(ViewSet):permission_classes = [UserPermission] REST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES': ['app01.auth.LoginAuth'],'DEFAULT_PERMISSION_CLASSES': ['app01.permissions.UserPermission',],
}
from rest_framework.permissions import BasePermission# 1 写一个类,继承 BasePermission
# 2 重写 has_permission
# 3 在方法中校验用户是否有权限,如果有,就返回True,如果没有,就返回False
# 4class UserPermission(BasePermission):def has_permission(self, request, view):# request 当次请求的request,  新的,它是在认证类之后执行的,如果认证通过了request.user 就是当前登录用户# 拿到当前登录用户,查看它的类型,确定有没有权限if request.user.user_type == 3:return Trueelse:self.message = '您的用户类型是:%s,您没有权限操作' % (request.user.get_user_type_display())return False

2.1 django项目国际化

# 配置文件中--->以后所有英文都会转成中文
INSTALLED_APPS = ['rest_framework'
]LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False

3 频率组件

# 控制一个接口,访问频次,比如一分钟只能访问1次
# 对接口进行访问次数限制# 使用步骤:# 1 写一个类,继承SimpleRateThrottle# 2 重写get_cache_key,返回什么,就以什么做限制: IP地址,用户id限制# 3 写一个类属性   scope = 'drf_day08'# 4 配置文件中配置''''DEFAULT_THROTTLE_RATES': {'drf_day08': '3/m',  # 一分钟访问三次   5/s,m,h,d},'''# 5 局部使用,全局使用,局部禁用class PublishView(ViewSet):throttle_classes = [IPRateThrottle]#6 全局使用'DEFAULT_THROTTLE_CLASSES': ['app01.throttling.IPRateThrottle'],
from rest_framework.throttling import SimpleRateThrottle# 1 写一个类,继承SimpleRateThrottle
# 2 重写get_cache_key,返回什么,就以什么做限制: IP地址,用户id限制
# 3 写一个类属性   scope = 'drf_day08'
# 4 配置文件中配置
''''DEFAULT_THROTTLE_RATES': {'drf_day08': '3/m',  # 一分钟访问三次},
'''# 5 局部使用,全局使用,局部禁用class IPRateThrottle(SimpleRateThrottle):scope = 'drf_day08'  # 写一个类属性def get_cache_key(self, request, view):# 返回ip,以ip地址限制print(request.META)return request.META.get('REMOTE_ADDR')

4 排序

# 只有5个接口中的查询所有,才涉及到排序# 查询所有用户---》接口# 使用步骤- 1 必须写在继承:GenericAPIView 类的视图类中才行-2 配置类属性:filter_backends = [OrderingFilter]ordering_fields=['id','user_type'] #可以排序的字段-3 使用:规定必须使用ordering 降序带负号http://127.0.0.1:8000/user/?ordering=user_type #用户类型升序排http://127.0.0.1:8000/user/?ordering=-user_type #用户类型降序排http://127.0.0.1:8000/user/?ordering=user_type,-id#先按用户类型升序排,如果用户类型一样,再按id降序排

代码展示

# 由于要和数据库打交道,这里不适合用ViewSet, 而要用GenericViewSet
# 但是多了两个功能 queryset 和 serializer_class,但不影响我们的使用
from rest_framework.viewsets import GenericViewSet
from rest_framework.generics import ListAPIView  # 继承ListAPIView可以
from rest_framework.mixins import ListModelMixin  # 继承ListModelMixin也可以
# 排序
from rest_framework.filters import OrderingFilterfrom .models import User
from .serializer import UserSerializer# 演示排序,写查询所有用户,视图类必须继承GenericAPIView
# 视图类 + 扩展类,要和数据库打交道
class UserView(GenericViewSet, ListModelMixin):# 配置了全局是,局部禁用认证authentication_classes = []# 局部禁用权限permission_classes = []# 局部禁用频率throttle_classes = []queryset = User.objects.all()serializer_class = UserSerializer# 排序filter_backends = [OrderingFilter]# 指定按照什么排序ordering_fields = ['id', 'user_type']@action(methods=['POST'], detail=False)  # 访问 /user/login/    post请求就会执行def login(self, request, *args, **kwargs):# 前端传入用户名密码username = request.data.get('username')password = request.data.get('password')user = User.objects.filter(username=username, password=password).first()if user:token = str(uuid.uuid4())UserToken.objects.update_or_create(defaults={'token': token, 'user': user})return Response({'code': 100, 'msg': '登录成功', 'token': token})return Response({'code': 101, 'msg': '用户名或密码错误'})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/71025.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学建模圈养湖羊的空间利用率

数学建模圈养湖羊的空间利用率 问题:规模化的圈养养殖场通常根据牲畜的性别和生长阶段分群饲养,适应不同种类、不同阶段的牲畜对空间的不同要求,以保障牲畜安全和健康;与此同时,也要尽量减少空间闲置所造成的资源浪费…

Code Inspector:点击页面元素自动定位到代码

Code Inspector是一个开发提效的神器 点击页面上的 DOM 元素,它能自动打开 IDE 并定位到 DOM 对应源代码位置 文档 https://inspector.fe-dev.cn/https://github.com/zh-lx/code-inspector 目录 1、安装2、配置2.1、webpack2.2、vue2.3、vite 3、使用 1、安装 n…

入栏需看——学习记忆

记忆方法千千种,本栏意在梳理其中道道来,旦有小得,肥肠幸耶。从不同角度分析学习记忆。 逻辑篇 有逻辑 用思维导图 思维导图记忆有逻辑的文本/内容 理论 巧记书本结构–思维导图 模仿 HCIE-Cloud Computing LAB备考第一步&#xff1a…

Python基于Mirai开发的QQ机器人保姆式教程(亲测可用)

在本教程中,我们将使用Python和Mirai来开发一个QQ机器人,本文提供了三个教学视频,包教包会,本文也很贴心贴了代码和相关文件。话不多说,直接开始教学。 目录 一、安装配置MIrai 图片验证码报错: 二、机器…

vue-cli中总提示组件没有正确注册

这里写目录标题 一、报错提示二、修改办法 一、报错提示 二、修改办法 <template><div><aside-component style"width: 15%"></aside-component></div> </template><script> import AsideComponent from /components/Asi…

【学习方法论】学习的三种境界、三种习惯、三个要点,三个心态

学习的三种境界、三种习惯、三个要点&#xff0c;三个心态 三种学习境界 苦学 古人云&#xff1a;“头悬梁、锥刺股”&#xff0c;勤学苦练是第一境界。处于这种层次的同学&#xff0c;觉得学习枯燥无味&#xff0c;对他们来说学习是一种被迫行为&#xff0c;体会不到学习中的…

NATAPP使用详细教程(免费隧道内网映射)

NATAPP - https://natapp.cn/tunnel/lists NATAPP 在开发时可能会有将自己开发的机器上的应用提供到公网上进行访问&#xff0c;但是并不想通过注册域名、搭建服务器&#xff1b;由此可以使用natapp&#xff08;内网穿透&#xff09; 购买免费隧道 修改隧道配置 看自己的web…

JAVA毕业设计096—基于Java+Springboot+Vue的在线教育系统(源码+数据库+18000字论文)

基于JavaSpringbootVue的在线教育系统(源码数据库18000字论文)096 一、系统介绍 本系统前后端分离 本系统分为管理员、用户两种角色(管理员角色权限可自行分配) 用户功能&#xff1a; 注册、登录、课程预告、在线课程观看、学习资料下载、学习文章预览、个人信息管理、消息…

【计算机视觉项目实战】中文场景识别

✨专栏介绍&#xff1a; 经过几个月的精心筹备&#xff0c;本作者推出全新系列《深入浅出OCR》专栏&#xff0c;对标最全OCR教程&#xff0c;具体章节如导图所示&#xff0c;将分别从OCR技术发展、方向、概念、算法、论文、数据集等各种角度展开详细介绍。 &#x1f468;‍&…

【Two Stream network (Tsn)】(二) 阅读笔记

贡献 将深度神经网络应用于视频动作识别的难点&#xff0c;是如何同时利用好静止图像上的 appearance information以及物体之间的运动信息motion information。本文主要有三点贡献&#xff1a; 1.提出了一种融合时间流和空间流的双流网络&#xff1b; 2.证明了直接在光流上训…

【C++精华铺】10.STL string模拟实现

1. 序言 STL&#xff08;标准模板库&#xff09;是一个C标准库&#xff0c;其中包括一些通用的算法、容器和函数对象。STL的容器是C STL库的重要组成部分&#xff0c;它们提供了一种方便的方式来管理同类型的对象。其中&#xff0c;STLstring是一种常用的字符串类型。 STLstrin…

Docker如何安装seafile

SQLite 方式 要在 Docker 中安装 Seafile&#xff0c;您可以按照以下步骤进行操作&#xff1a; 安装 Docker&#xff1a;确保您的系统上已经安装了 Docker。您可以根据您的操作系统类型&#xff0c;在官方网站上找到适合您系统的 Docker 版本并进行安装。 下载 Seafile 镜像&…

解决Oracle数据库中日期格式不识别的问题

在数据库开发中&#xff0c;我们经常需要处理日期和时间数据。当我们在Oracle数据库中执行UPDATE语句时&#xff0c;可能会遇到ORA-01821错误&#xff0c;该错误表示提供的日期格式无法被数据库识别。本文将介绍如何解决Oracle数据库中日期格式不识别的问题。 问题分析&#x…

Unity设置TextMeshPro文本超出范围显示...

TextMtshPro文本超出范围&#xff0c;展示省略。选择Overflow为Ellipsis。

centroen 23版本换界面了

旧版本 新版本 没有与操作系统一起打包的ISO文件了&#xff0c;要么先安装系统&#xff0c;再安装Centreon&#xff0c;要么用pve导入OVF文件

Shell命令操作Linux文件系统

Shell命令操作Linux文件系统 文件夹介绍 文件夹常规命令 文件夹权限控制⭐ 文件类型和权限 修改文件权限 移动、复制、删除文件夹 文件夹介绍 Linux文件系统是计算机操作系统中的一个关键组成部分&#xff0c;它用于管理和组织计算机上的数据和信息。先到根目录&#xf…

支付宝使用OceanBase的历史库实践分享

为解决因业务增长引发的数据库存储空间问题&#xff0c;支付宝基于 OceanBase 数据库启动了历史库项目&#xff0c;通过历史数据归档、过期数据清理、异常数据回滚&#xff0c;实现了总成本降低 80%。 历史数据归档&#xff1a;将在线库&#xff08;SSD 磁盘&#xff09;数据归…

STDF-Viewer 解析工具说明

一、简介 1. 概述 STDF&#xff08;Standard Test Data Format&#xff09;&#xff08;标准测试数据格式&#xff09;是半导体测试行业的最主要的数据格式&#xff0c;包含了summary信息和所有测试项的测试结果&#xff1b;是半导体行业芯片测试数据的存储规范。 在半导体行业…

解决Nacos服务器连接问题:一次完整的排查经验分享

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…