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

请求的时候用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 的权限管理的更多相关文章

  1. ASP.NET 开发必备知识点(2):那些年追过的ASP.NET权限管理

    一.前言 在前一篇文章已经为大家介绍了OWIN和Katana,有了对他们的了解之后,才能更好地去学习Asp.net Identity,因为Asp.net Identity的实现集成了Owin.其实在A ...

  2. ASP.NET MVC+EF框架+EasyUI实现权限管理系列

    http://www.cnblogs.com/hanyinglong/archive/2013/03/22/2976478.html ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开 ...

  3. YIi 权限管理和基于角色的访问控制

    验证和授权(Authentication and Authorization) 定义身份类 (Defining Identity Class) 登录和注销(Login and Logout) 访问控制 ...

  4. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(11)-验证码实现和底层修改

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(11)-验证码实现和底层修改 ASP.NET MVC+EF框架+EasyUI实现权限管系列  (开篇)   (1):框架搭建    ...

  5. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(6)- EF上下文实例管理

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(6)- EF上下文实例管理 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    ( ...

  6. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(3)-面向接口的编程

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(3)-面向接口的编程 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)  (1)框架搭建    (2):数据 ...

  7. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1)框架搭建 前言:这 ...

  8. ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇 前言:博客又有一段时间没有更新了,心里感觉这段时间空空的,好像什么都没有学下,所以就想写博客,所以就有了这个系列,这里当然也 ...

  9. 开篇ASP.NET MVC 权限管理系列

    开篇 [快乐编程系列之ASP.NET MVC 权限管理系列]一.开篇   用了好长一段时间的ASP.NET MVC,感觉MVC真的是很好用,最近一年左右做了两个中小型项目,觉得还是很多地方不是很熟悉的 ...

随机推荐

  1. vue 监听对象里的特定数据

    vue  监听对象里的特定数据变化 通常是这样写的,只能监听某一个特定数据 watch: { params: function(val) { console.log(val) this.$ajax.g ...

  2. my97datePicker的相信使用

    http://www.my97.net/dp/demo/resource/2.1.asp

  3. Zookeeper初见

    这是Zookeeper学习总结 的系列文章. ZK简介 ZK部署及运行 ZK的常用API 创建会话 创建节点 删除节点 读取数据节点 更新数据 检测节点是否存在 ZK的开源封装

  4. 不会几个框架,都不好意思说搞过前端: React 入门实例教程

    现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑. React 起源于 Face ...

  5. b-树和b+树以及mysql索引

    b-树(m阶): 1.根节点至少有2个子节点; 2.中间节点包含k个子节点和k-1个元素,m/2 <= k <= m; 3.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子 ...

  6. JavaScript预编译详解

    一.js运行三部曲: 1.语法分析(通篇扫描看有没有语法错误) 2.预编译 3.解释执行 二.预编译前奏 1.imply global 暗示全局变量:任何变量如果未经声明就赋值,此变量为全局对象所有 ...

  7. Linux下常用的3种软件安装方式

    一:Linux源码安装    1.解压源码包文件    源码包通常会使用tar工具归档然后使用gunzip或bzip2进行压缩,后缀格式会分别为.tar.gz与.tar.bz2,分别的解压方式:   ...

  8. SQL Server操作结果集-并集 差集 交集 结果集排序

    操作结果集 为了配合测试,特地建了两个表,并且添加了一些测试数据,其中重复记录为东吴的人物. 表:Person_1魏国人物 表:Person_2蜀国人物 A.Union形成并集 Union可以对两个或 ...

  9. .NET环境下使用水晶报表

    .NET环境下使用水晶报表 听语音 | 浏览:3280 | 更新:2013-12-20 13:36 1 2 3 4 5 6 7 分步阅读 水晶报表(Crystal Reports)-商务智能软件,通常 ...

  10. Java8新特性--流(Stream)

    1.简介      Java 8是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和JVM等方面的十多个新特性.在本文中我们一起来学习引入的一个新特性- ...