Django:RestFramework之-------权限
4.restframework-权限
4.1权限:
- 权限在单个视图应用。
class MyPermission(object):
"""认证类"""
def has_permission(self,request,view):
"""重写has_permission方法"""
#判断用户类型
if request.user.user_type != 3:
return False
return True
class OrderView(APIView):
"""订单业务 (只有SVIP能看到)"""
#message当权限未通过,返回内容。
message = "必须是SVIP才可以进行访问"
authentication_classes = [Authtication,]#用于认证
permission_classes = [MyPermission,]#用于权限控制
def get(self,request,*args,**kwargs):
ret = {"code": 1000, "msg": None, "data": None}
try:
ret['data'] = ORDER_DICT
except Exception as e:
pass
return JsonResponse(ret)
效果:
当用于在url键入user_type=1的用户拒绝访问:
http://127.0.0.1:8000/api/v1/order/?token=408a04dbce13814fd076807f865429b4
当用户在url键入user_type=3的用户拿到数据库内容:
http://127.0.0.1:8000/api/v1/order/?token=f2c781da6953632d0c5421e8cb17e740

4.2权限源码解析
#-----------------------dispatch---------------------------
#执行dispatch方法:
def dispatch(self, request, *args, **kwargs):
...
#封装request,获取一个加强版request
request = self.initialize_request(request, *args, **kwargs)
...
#执行初始化方法
self.initial(request, *args, **kwargs)
...
#-----------------------------------------------------------
#-----------------------initial---------------------------
def initial(self, request, *args, **kwargs):
...
self.check_permissions(request)#进行权限检验。
...
#-----------------------------------------------------------
#-----------------------check_permissions-------------------
def check_permissions(self, request):
# 列表存储着 权限类的对象
for permission in self.get_permissions():
#如果是自定义权限类必须有has_permission方法。这样才能进行权限判断,权限认证时,当什么都没有返回表示正常执行,触发异常表示权限验证失败。 message就是触发异常后回的异常消息.
if not permission.has_permission(request, self):
self.permission_denied(
request, message=getattr(permission, 'message', None)
)
#循环遍历self.get_permissions(),那么self.get_permissions()做什么事情呢?进入看一下
#--------------------get_permissions------------------------
def get_permissions(self):
return [permission() for permission in self.permission_classes]
#通过遍历permission_classes,返回一个列表。
#而在我们没有在视图定义:permission_classes时候会默认找配置文件的permission_classes,如下:
permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES
#-----------------------------------------------------------
4.3全局和局部配置权限:
#全局配置settings.py配置
"DEFAULT_PERMISSION_CLASSES":['app.utils.permission.MyPermission']
#局部配置
permission_classes = [MyPermission,]#用于权限控制,MyPermission自定义权限类

4.4django内置权限类
from rest_framework.permissions import BasePermission
class BasePermission(metaclass=BasePermissionMetaclass):
"""
A base class from which all permission classes should inherit.
"""
#定义has_permission方法
def has_permission(self, request, view):
"""
Return `True` if permission is granted, `False` otherwise.
"""
return True
def has_object_permission(self, request, view, obj):
"""
Return `True` if permission is granted, `False` otherwise.
"""
return True
#允许任何访问
class AllowAny(BasePermission):pass
4.5权限使用流程:(自定义权限类)
为了规范:以后写权限类,要继承
BasePermission.返回值:
- True 有权访问
- False 无权访问
Django:RestFramework之-------权限的更多相关文章
- django restframework
一.django restframework 请求流程源码剖析 上面的认证一个流程是rest_framework的关于APIauth的认证流程,,这个流程试用权限.频率.版本.认证.这个四个组件都是通 ...
- django restframework 快速入门
django restframework 快速入门 基本流程 建立 Models 依靠 Serialiers 将数据库取出的数据 Parse 为 API 的数据(可用于返回给客户端,也可用于浏览器显示 ...
- Django Restframework 实践(一)
具备以下知识: django http://www.cnblogs.com/menkeyi/p/5882464.html http://www.cnblogs.com/menkeyi/p/588245 ...
- django restframework 的日常使用
本文讨论 django restframework 的日常使用,满足常用 api 编写的需求,比如 List, Detail, Update, Put, Patch 等等.探讨 django rest ...
- Django RestFramework (DRF)
准备: 下载 pip install djangorestframework 一 APIView源码解析 1 预备知识 CBV(class based view)FBV(function based ...
- django restframework serializer 增加自定义字段
在使用django restframework serializer 序列化在django中定义的model时,有时候我们需要额外在serializer中增加一些model中没有的字段.有两种方法实现 ...
- Django中用户权限模块
Django中用户权限模块 1 auth模块 auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理. auth可以和admin模块配合使用, 快速建立网站的管理系 ...
- django restframework jwt
既然要来学习jwt(json web token),那么我们肯定是先要了解jwt的优势以及应用场景--跨域认证. $ pip install djangorestframework-jwt 传统coo ...
- Django内置权限扩展案例
当Django的内置权限无法满足需求的时候就自己扩展吧~ 背景介绍 overmind项目使用了Django内置的权限系统,Django内置权限系统基于model层做控制,新的model创建后会默认新建 ...
随机推荐
- robotframework中文日志显示乱码
转:http://blog.csdn.net/huashao0602/article/details/55045719
- robotframework-selenium2library各个版本
https://github.com/robotframework/Selenium2Library/downloads
- 04-cmake语法-STREQUAL
STREQUAL 用于比较字符串,相同返回 true .
- B1003
import re n = input() for i in range(int(n)): str = input() if re.match(r'A*PA+TA*',str): a = re.spl ...
- display:none和visibility:hidden
w3school学习网:https://www.w3school.com.cn/tiy/t.asp?f=hdom_style_display_none display: none----将元素的显示设 ...
- python 项目实战之logging日志打印
官网介绍:https://docs.python.org/2/library/logging.html 一. 基础使用 1.1 logging使用场景 日志是什么?这个不用多解释.百分之九十的程序都需 ...
- Java编程思想之十八 枚举类型
关键字enum可以将一组具名的值的有限集合创建为一种新的类型, 而这些具名的值可以作为常规的程序组件使用.这是一种非常有用的功能. 18.1 基本enum特性 创建enum时,编译器会为你生成一个相关 ...
- Docker 一步搞定 ZooKeeper 集群的搭建
Docker 一步搞定 ZooKeeper 集群的搭建 背景 原来学习 ZK 时, 我是在本地搭建的伪集群, 虽然说使用起来没有什么问题, 但是总感觉部署起来有点麻烦. 刚好我发现了 ZK 已经有了 ...
- java ---- 认识类和对象
---- 开发方法 结构化开发方法特点: 1.面向功能划分软件结构 2.自顶而下 3.最小的子系统是方法 4.制约了软件的可维护性和扩展性 面向对象开发方法特点: 1.把软件系统看成各种对象和集合 ...
- Linux手动安装新版本Python教程(CentOS)
一.说明 1.1 linux为什么不升级python版本 2008年python3就发布了,到2020年1月1日python2.7就停止更新了,为什么主流的linux迟迟不去除python2自带pyt ...