rest framework 的权限管理
下面是对单个的视图进行的设置的:
请求的时候用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'] = 1
ret['error'] = "用户名或密码错误" return Response(ret)
生成请求的token字符串:
#生成Token函数
def get_token_code(username):
'''
根据用户名和时间戳生成用户登陆成功过的随机字符串
:param username: 字符串格式用户名
:return: 字符串格式Token
''' import time
import hashlib
timestamp = 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 models from 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,token
else:
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.CommentSerializer
    authentication_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 True def has_object_permission(self,request,view,obj): # 重写父类的方法 名字必须这样 '''
obj是你的当前文章的作者对象
判断当前的评论用户作者是不是你当前的用户
只有评论的作者才能删除自己的评论
'''
if request.method in ['PUT',"DELETE"]:
if obj.user == request.user:
# 当前要删除的评论的作者就是当前登陆的用户
return True
else:
return False
else:
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 DefaultRouter router = 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,SimpleRateThrottle from rest_framework.throttling import SimpleRateThrottle import time D = {} class MyThorttle(BaseThrottle):
def allow_request(self, request, view):
'''
返回True就放行 返回False 表示被限制了 '''
# 获取当前的ip
ip = request.META.get("REMOTE_ADDR") # 获取请求的IP
print('这是自定义希纳是类的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 False
else:
# 把这一次的访问时间加到访问历史列表的第一位
D[ip].insert(0,now)
return True class 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'
}
}
rest framework 的权限管理的更多相关文章
- ASP.NET 开发必备知识点(2):那些年追过的ASP.NET权限管理
		一.前言 在前一篇文章已经为大家介绍了OWIN和Katana,有了对他们的了解之后,才能更好地去学习Asp.net Identity,因为Asp.net Identity的实现集成了Owin.其实在A ... 
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列
		http://www.cnblogs.com/hanyinglong/archive/2013/03/22/2976478.html ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开 ... 
- YIi 权限管理和基于角色的访问控制
		验证和授权(Authentication and Authorization) 定义身份类 (Defining Identity Class) 登录和注销(Login and Logout) 访问控制 ... 
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(11)-验证码实现和底层修改
		原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(11)-验证码实现和底层修改 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 ... 
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(6)- EF上下文实例管理
		原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(6)- EF上下文实例管理 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 ( ... 
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(3)-面向接口的编程
		原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(3)-面向接口的编程 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1)框架搭建 (2):数据 ... 
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo
		原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1)框架搭建 前言:这 ... 
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇
		原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇 前言:博客又有一段时间没有更新了,心里感觉这段时间空空的,好像什么都没有学下,所以就想写博客,所以就有了这个系列,这里当然也 ... 
- 开篇ASP.NET MVC 权限管理系列
		开篇 [快乐编程系列之ASP.NET MVC 权限管理系列]一.开篇 用了好长一段时间的ASP.NET MVC,感觉MVC真的是很好用,最近一年左右做了两个中小型项目,觉得还是很多地方不是很熟悉的 ... 
随机推荐
- JBoss Web和Tomcat的区别
			在Web2.0的时代,基于Tomcat内核的JBoss在J2EE应用服务器领域已成为发展最为迅速的应用服务器.这一青出于蓝而胜于蓝的产品与Tomcat的区别又在哪里? 基于Tomcat内核,青胜于蓝. ... 
- UIKit 框架之UITextView
			// // ViewController.m // UItextView // // Created by City--Online on 15/5/22. // Copyright (c) 2015 ... 
- Ajax中的同步和异步
			var flag=true; ; $.ajax({ url: "http://www.jb51.net/", success: function(data){ flag=false ... 
- JavaScript部分兼容性函数
			1.getElementsByClassName() function getElementsByClassName(node,classname){ if(node.getElementsByCla ... 
- ILMerge将源DLL合并到目标EXE
			ILMerge将源DLL合并到目标EXE(.NET4.6.2) 本文为原创文章,如转载,请在网页明显位置标明原文名称.作者及网址,谢谢! 本文主要是使用微软的ILMerge工具将源DLL合并到目标EX ... 
- win10 uwp 商业游戏
			本文告诉大家去做一个商业游戏,游戏很简单,几乎没有什么技术 游戏的开始,需要添加框架库,于是引用我自己写的库. 首先是创建一个启动页面,这个页面是显示启动的. 在显示启动的时候,是需要加载游戏需要使用 ... 
- 数据库导出Excel(转载)
			来源:https://jingyan.baidu.com/article/3065b3b68f2ab7becef8a449.html SQLServer2005或者SQLServer2008.SQLS ... 
- [日常] Apache Order Deny,Allow的用法
			Order Deny,Allow的用法:影响最终判断结果的只有两点:1. order语句中allow.deny的先后顺序,最后的是最优先的:2. allow.deny语句中各自包含的范围. 常用:Or ... 
- xmpp实现的即时通讯聊天(二)
			参考网址:http://www.jianshu.com/p/8894a5a71b70 借图描述原理: 三.注册.登陆.聊天功能的实现 故事板如下: 四个类如下: 不喜多言,直接上Demo: Login ... 
- 线程10--NSOperation的基本操作
			一.并发数 (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. (3)最⼤大并发数的相关⽅方法 - (NSInteg ... 
