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真的是很好用,最近一年左右做了两个中小型项目,觉得还是很多地方不是很熟悉的 ...
随机推荐
- IE6基本bug
一.IE6双倍边距bug当页面上的元素使用float浮动时,不管是向左还是向右浮动:只要该元素带有margin像素都会使该值乘以2,例如“margin-left:10px” 在IE6中,该值就会被解析 ...
- Python 工匠:善用变量来改善代码质量
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由鹅厂优文发表于云+社区专栏 作者:朱雷 | 腾讯IEG高级工程师 『Python 工匠』是什么? 我一直觉得编程某种意义上是一门『手艺 ...
- rails常用验证方法
validates_presence_of :login, :message => "用户名不能为空!" validates_length_of ...
- Beta--冲刺阶段合集
冲刺前计划与安排:https://www.cnblogs.com/pubg722/p/9069234.html 第一篇冲刺博客:http://www.cnblogs.com/pubg722/p/909 ...
- Node.js处理I/O数据之Buffer模块缓冲数据
一.前传 在之前做web时也经常用到js对象转json和json转js对象.既然是Node.js处理I/O数据,也把这个记下来. Json转Js对象:JSON.parse(jsonstr); //可以 ...
- Jquery ui draggable在chrome和ie7下的bug
当页面足够长,向下滚动一些之后, 在拖动时,被拖动的div会向下产生滚动距离那么高(scrolltop)的差距 鼠标位置距div顶部差距了正好页面scroll的距离,页面scoll越多差的越多. 解决 ...
- F#注解
不要问我为啥要学F#——因为气质摆在那里 标注:以下内容均来自 anderslly F#系列 1.类型推演 let square x = x * x //接受一个某类型参数的quare函数返回一个这个 ...
- [日常] Apache Order Deny,Allow的用法
Order Deny,Allow的用法:影响最终判断结果的只有两点:1. order语句中allow.deny的先后顺序,最后的是最优先的:2. allow.deny语句中各自包含的范围. 常用:Or ...
- Python Django ORM 字段类型、参数、外键操作
AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 primary ...
- HDU2102(KB2-I)
A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...