热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

restframework的权限管理

下面是对单个的视图进行的设置的:请求的时候用postman然后发送信息我们下面所有的举例都是在用户对Comment这个表的操作首先先生成一个类似于cookie的字符串

 

 

 

 

下面是对单个的视图进行的设置的:

请求的时候用postman然后发送信息

 

我们下面所有的举例都是在用户对Comment这个表的操作

 

首先先生成一个类似于COOKIE的字符串 发送给前端浏览器 然后下次它再访问带着这个认证字符串

登陆视图

#登陆视图class LoginView(APIView):def post(self,request):ret = {"status":0}print(request.data)username = request.data.get("username")password = request.data.get('password')user_obj = models.UserInfo.objects.filter(username = username,password = password).first() # 校验看传递进来的是否对的print(11111)if user_obj:print(2222222)#校验成功 加密并且写入 Token中它的token = get_token_code(username)models.Token.objects.update_or_create(defaults={'token':token},user = user_obj) # 有就更新 没有就创建ret['token'] = token #加密的内容存起来else:ret['status'] = 1ret['error'] = "用户名或密码错误"return Response(ret)

 

 

生成请求的token字符串:

#生成Token函数
def get_token_code(username):'''根据用户名和时间戳生成用户登陆成功过的随机字符串:param username: 字符串格式用户名:return: 字符串格式Token'''import timeimport hashlibtimestamp = str(time.time())m = hashlib.md5(bytes(username,encoding="utf8"))m.update(bytes(timestamp,encoding="utf8"))return m.hexdigest()

 

 

 

认证:     BaseAuthentication

from rest_framework.authentication import BaseAuthentication # 认证模块

 

 

抛错模块:

from rest_framework.exceptions import AuthenticationFailed # 模块报错 返回信息

 

我们可以根据这个来设置 登陆人的信息  只有登陆成功后才能进行提交post之类的操作 

这个时候就用到了我们的权限设置

 

我们写一个文件来存放登陆的信息设置:

from rest_framework.authentication import BaseAuthentication # 认证模块from first import modelsfrom rest_framework.exceptions import AuthenticationFailed # 模块报错 返回信息
import logging
logger
= logging.getLogger(__name__)
class MyAuth(BaseAuthentication):def authenticate(self, request):print(request.method)if request.method in ["POST","PUT","DELETE"]:token = request.data.get("token") #获取你登陆的信息token_obj = models.Token.objects.filter(token = token).first() #去数据库中阿奎那有没有这个数据if token_obj:return token_obj.user,tokenelse:raise AuthenticationFailed('无效的token')else:return None,None

 

 

views:

就是把你的认证设置导入进来 然后再用到post get操作的总操作的集合模块对操作设置

from first.utils.auth import MyAuth #导入你的 认证信息设置class CommentViewSet(ModelViewSet):queryset = models.Comment.objects.all()serializer_class = first_serializers.Commentserializer #这个是你的对Comment的定义设置的
authentication_classes = [MyAuth] # 让你设置的认证生效

 

 

视图级别认证

class CommentViewSet(ModelViewSet):queryset = models.Comment.objects.all()serializer_class = app01_serializers.CommentSerializerauthentication_classes = [MyAuth, ]

全局级别认证

# 在settings.py中配置
REST_FRAMEWORK = {"DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.MyAuth", ]
}

 

权限管理:BasePermission  

from rest_framework.permissions import BasePermission #导入权限设置的模块

 

也是设置一个权限管理的模块:

from rest_framework.permissions import BasePermission #导入权限设置的模块class MyPermission(BaseException):message = '快滚,没有权限!'def has_permission(self,request,view):'''判断该用户有没有权限如果有就返回True如果没有就返回False'''print('我要进行自定义设置了')return Truedef has_object_permission(self,request,view,obj): # 重写父类的方法 名字必须这样'''obj是你的当前文章的作者对象判断当前的评论用户作者是不是你当前的用户只有评论的作者才能删除自己的评论'''if request.method in ['PUT',"DELETE"]:if obj.user == request.user:# 当前要删除的评论的作者就是当前登陆的用户return Trueelse:return Falseelse:return True

 

 

views:

from first.utils.auth import MyAuth #导入你的 认证信息设置
from first.utils.permission import MyPermission #导入权限管理的模块class CommentViewSet(ModelViewSet):queryset = models.Comment.objects.all()serializer_class = first_serializers.Commentserializer #这个是你的对Comment的定义设置的
authentication_classes = [MyAuth,]permission_classes = [MyPermission,] # 把你权限管理的设置导入进来

 

 

这个时候你就要给你的url设置了 就像之前解除的  继承全局的然后并不需要设置很多url  设置一个就可以

ursl:

from rest_framework.routers import DefaultRouterrouter = DefaultRouter()
router.register(r
'comment', views.CommentViewSet) #这个就是设置你的输入并且查找的视图
urlpatterns += router.urls

 

 

 

限制:

 

from rest_framework.throttling import SimpleRateThrottle

 

定义一个访问次数限制:

 

自定以的限制:

class VisitThorttle(SimpleRateThrottle):scope = "ooo" #这个名字随便起 是你设置全局的时候的给对应的def get_cache_key(self, request, view):return self.get_ident(request) # 求当前访问的IP

 

其实上面是执行了这个流程:

'''
自定义访问限制类
'''from rest_framework.throttling import BaseThrottle,SimpleRateThrottlefrom rest_framework.throttling import SimpleRateThrottleimport timeD = {}class MyThorttle(BaseThrottle):def allow_request(self, request, view):'''返回True就放行 返回False 表示被限制了'''# 获取当前的ipip = request.META.get("REMOTE_ADDR") # 获取请求的IPprint('这是自定义希纳是类的allow_request')print(ip)#获取当前时间now = time.time()#判断当前ip是否有访问记录if ip in D:D[ip] = [] #初始化一个空的访问历史列表#高端history = D[ip]while history and now -history[-1] > 30: #有ip并且当前时间减去储存的最后一个时间
history.pop()if len(history) >= 3:return Falseelse:# 把这一次的访问时间加到访问历史列表的第一位
D[ip].insert(0,now)return Trueclass VisitThorttle(SimpleRateThrottle):scope = "ooo" #这个名字随便起def get_cache_key(self, request, view):return self.get_ident(request) # 求当前访问的IP

真正流程

 

 

 

views:

from first.utils.throttle import VisitThorttle # 导入自定义访问限制class CommentViewSet(ModelViewSet):queryset = models.Comment.objects.all()serializer_class = first_serializers.Commentserializer #这个是你的对Comment的定义设置的throttle_classes = [VisitThorttle,] #把自定义的访问限制类

 

 

 

全局设置   全局的请求设置是你只要进去就会触发  而我们在views中的设置  只是有针对的对一些视图进行设置

 

全局设置:

在settings设置;

# rest framework相关的配置项
REST_FRAMEWORK = { 关于认证的全局配置 'DEFAULT_AUTHENTICATION_CLASSES': ['app01.utils.auth.MyAuth', ], 'DEFAULT_PERMISSION_CLASSES': ['app01.utils.permission.MyPermission'], #"DEFAULT_THROTTLE_CLASSES": ["app01.utils.throttle.MyThrottle", ],"DEFAULT_THROTTLE_RATES": { # 这个和上面的都可以设置 "ooo": "5/m",    # ooo对应你后自定以的设置的scope"xxx": '10/m'}
}

 

 

 

 

 

 

 

 

 

 

转:https://www.cnblogs.com/zhaoyunlong/p/9416569.html



推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 我创建了一个新的AWSSSO(使用内部IDP作为身份源,因此不使用ActiveDirectory)。我能够登录AWSCLI、AWSGUI,但 ... [详细]
author-avatar
歪友46300606
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有