Django rest framework ---- 权限

添加权限

api/utils文件夹下新建premission.py文件,代码如下:

  • message是当没有权限时,提示的信息
  1. # FileName : permission.py
  2. # Author : Adil
  3. # DateTime : 2019/7/30 5:14 PM
  4. # SoftWare : PyCharm
  5. from rest_framework.permissions import BasePermission
  6.  
  7. class SVIPPermission(object):
  8.  
  9. message = '必须是SVIP才能访问!'
  10. def has_permission(self,request,view):
  11. if request.user.user_type !=3:
  12. return False
  13.  
  14. return True
  15.  
  16. class MyPermission(object):
  17.  
  18. def has_permission(self,request,view):
  19. if request.user.user_type == 3:
  20. return False
  21. return True

settings.py全局配置权限

  1. #设置全局认证
  2. REST_FRAMEWORK = {
  3. "DEFAULT_AUTHENTICATION_CLASSES":['api.utils.auth.Authentication',], #里面写你的认证的类的路径
  4. "DEFAULT_PERMISSION_CLASSES":['api.utils.permission.SVIPPermission',], # 添加权限路径
  5. }

views.py添加权限

  • 默认所有的业务都需要SVIP权限才能访问
  • OrderView类里面没写表示使用全局配置的SVIPPremission
  • UserInfoView类,因为是普通用户和VIP用户可以访问,不使用全局的,要想局部使用的话,里面就写上自己的权限类
  • permission_classes = [MyPremission,]   #局部使用权限方法
  1. from django.shortcuts import render
  2.  
  3. # Create your views here.
  4.  
  5. import time
  6. from api import models
  7. from django.http import JsonResponse
  8. from rest_framework.views import APIView
  9. from rest_framework.request import Request
  10. from rest_framework import exceptions
  11. from rest_framework.authentication import BasicAuthentication
  12. from django.shortcuts import render,HttpResponse
  13.  
  14. from api.utils.permission import SVIPPermission,MyPermission
  15.  
  16. ORDER_DICT = {
  17.  
  18. 1:{
  19. 'name':'apple',
  20. 'price':15
  21. },
  22. 2:{
  23. 'name':'orange',
  24. 'price':30
  25. }
  26. }
  27.  
  28. def md5(user):
  29. import hashlib
  30. import time
  31. ctime = str(time.time())
  32. print(ctime)
  33. m = hashlib.md5(bytes(user,encoding='utf-8'))
  34. print(m)
  35. m.update(bytes(ctime,encoding='utf-8'))
  36. print(m)
  37. usertoken = m.hexdigest()
  38. print(usertoken)
  39.  
  40. return usertoken
  41.  
  42. class AuthView(APIView):
  43.  
  44. authentication_classes = [] # 里面为空,代表不需要认证
  45. permission_classes = []
  46. def post(self,request,*args,**kwargs):
  47. print('参数',request)
  48.  
  49. ret = {'code':1000,'msg':None,'token':None}
  50. try:
  51. # 参数是datadict 形式
  52. usr = request.data.get('username')
  53. pas = request.data.get('password')
  54.  
  55. # usr = request._request.POST.get('username')
  56. # pas = request._request.POST.get('password')
  57.  
  58. # usr = request.POST.get('username')
  59. # pas = request.POST.get('password')
  60.  
  61. print(usr)
  62. print(pas)
  63. # obj = models.User.objects.filter(username='yang', password='123456').first()
  64. obj = models.User.objects.filter(username=usr,password=pas).first()
  65. # obk =models.userToken.objects.filter(token='9c979c316d4ea42fd998ddf7e8895aa4').first()
  66. # print(obk.token)
  67. print('******')
  68. print(obj)
  69. print(type(obj))
  70. print(obj.username)
  71. print(obj.password)
  72. if not obj:
  73. ret['code'] = ''
  74. ret['msg'] = '用户名或者密码错误'
  75. return JsonResponse(ret)
  76. # 里为了简单,应该是进行加密,再加上其他参数
  77. # token = str(time.time()) + usr
  78. token = md5(usr)
  79. print(token)
  80. models.userToken.objects.update_or_create(user=obj, defaults={'token': token})
  81. ret['token'] = token
  82. ret['msg'] = '登录成功'
  83. #ret['token'] = token
  84. except Exception as e:
  85. ret['code'] = 1002
  86. ret['msg'] = '请求异常'
  87. return JsonResponse(ret)
  88.  
  89. class OrderView(APIView):
  90. '''订单业务'''
  91.  
  92. # authentication_classes = []
  93.  
  94. # permission_classes = []
  95. def get(self,request,*args,**kwargs):
  96. print("~~~~~~")
  97. print(request.user)
  98. print(request.auth)
  99. print("~~~~~~")
  100. ret = {'code':1000,'msg':None,'data':None}
  101. try:
  102. ret['data'] = ORDER_DICT
  103. except Exception as e:
  104. pass
  105. return JsonResponse(ret)
  106.  
  107. class UserInfoView(APIView):
  108. '''
  109. 订单相关业务(普通用户和VIP用户可以看)
  110. '''
  111. permission_classes = [MyPermission,] #不用全局的权限配置的话,这里就要写自己的局部权限
  112. def get(self,request,*args,**kwargs):
  113.  
  114. print(request.user)
  115. return HttpResponse('用户信息')
  116.  
  117. # if __name__ == '__main__':
  118. #
  119. # md5('yang')

urls

  1. """logintest URL Configuration
  2.  
  3. The `urlpatterns` list routes URLs to views. For more information please see:
  4. https://docs.djangoproject.com/en/2.1/topics/http/urls/
  5. Examples:
  6. Function views
  7. 1. Add an import: from my_app import views
  8. 2. Add a URL to urlpatterns: path('', views.home, name='home')
  9. Class-based views
  10. 1. Add an import: from other_app.views import Home
  11. 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
  12. Including another URLconf
  13. 1. Import the include() function: from django.urls import include, path
  14. 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
  15. """
  16. from django.contrib import admin
  17. from django.urls import path
  18. from django.conf.urls import url
  19.  
  20. from api.views import AuthView
  21. from api.views import OrderView,UserInfoView
  22. from api.appview.register import registerView
  23. from django.views.generic.base import TemplateView # 1、增加该行
  24.  
  25. urlpatterns = [
  26. path('admin/', admin.site.urls),
  27. path(r'',TemplateView.as_view(template_name='index.html')), #2、 增加该行
  28. url(r'^api/v1/auth/$', AuthView.as_view()),
  29. url(r'^api/v1/order/$', OrderView.as_view()), # 权限
  30. url(r'^api/v1/info/',UserInfoView.as_view()), # 权限
  31. url(r'^home/register/$', registerView.as_view()),
  32. ]

测试

普通用户访问OrderView,提示没有权限

普通用户访问UserInfoView,可以返回信息

内置权限

django-rest-framework内置权限BasePermission

默认是没有限制权限

  1. class BasePermission(object):
  2. """
  3. A base class from which all permission classes should inherit.
  4. """
  5.  
  6. def has_permission(self, request, view):
  7. """
  8. Return `True` if permission is granted, `False` otherwise.
  9. """
  10. return True
  11.  
  12. def has_object_permission(self, request, view, obj):
  13. """
  14. Return `True` if permission is granted, `False` otherwise.
  15. """
  16. return True

我们自己写的权限类,应该去继承BasePermission,修改之前写的permission.py文件

  1. # utils/permission.py
  2.  
  3. from rest_framework.permissions import BasePermission
  4.  
  5. class SVIPPremission(BasePermission):
  6. message = "必须是SVIP才能访问"
  7. def has_permission(self,request,view):
  8. if request.user.user_type != 3:
  9. return False
  10. return True
  11.  
  12. class MyPremission(BasePermission):
  13. def has_permission(self,request,view):
  14. if request.user.user_type == 3:
  15. return False
  16. return True

总结:

(1)使用

  • 自己写的权限类:1.必须继承BasePermission类;  2.必须实现:has_permission方法

(2)返回值

  • True   有权访问
  • False  无权访问

(3)局部

  • permission_classes = [MyPremission,]

(4)全局

  1.  
  1. REST_FRAMEWORK = {
  2. #权限
  3. "DEFAULT_PERMISSION_CLASSES":['api.utils.permission.SVIPPremission'],
  4. }

Django rest framework ---- 权限的更多相关文章

  1. Django REST framework - 权限和限制

    目录 Django REST framework 权限和限制 (你能干什么) 设置权限的方法 案例 第一步: 定义一个权限类 第二步: 使用 视图级别 全局级别设置 --- 限制 (你一分钟能干多少次 ...

  2. django rest framework权限和认证

    Django rest framework之权限 一.Authentication用户认证配置 1.四种验证及官网描述: BasicAuthentication 此身份验证方案使用HTTP基本身份验证 ...

  3. Django rest framework 权限操作(源码分析)

    知识回顾http://www.cnblogs.com/ctztake/p/8419059.html 这一篇是基于上一篇写的,上一篇谢了认证的具体流程,看懂了上一篇这一篇才能看懂, 当用户访问是 首先执 ...

  4. Django REST framework —— 权限组件源码分析

    在上一篇文章中我们已经分析了认证组件源码,我们再来看看权限组件的源码,权限组件相对容易,因为只需要返回True 和False即可 代码 class ShoppingCarView(ViewSetMix ...

  5. Django rest framework源码分析(2)----权限

    目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...

  6. 04 Django REST Framework 认证、权限和限制

    目前,我们的API对谁可以编辑或删除代码段没有任何限制.我们希望有更高级的行为,以确保: 代码片段始终与创建者相关联. 只有通过身份验证的用户可以创建片段. 只有代码片段的创建者可以更新或删除它. 未 ...

  7. Django Rest Framework(认证、权限、限制访问频率)

    阅读原文Django Rest Framework(认证.权限.限制访问频率) django_rest_framework doc django_redis cache doc

  8. Django Rest framework 之 权限

    django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) django res ...

  9. Django Rest Framework源码剖析(二)-----权限

    一.简介 在上一篇博客中已经介绍了django rest framework 对于认证的源码流程,以及实现过程,当用户经过认证之后下一步就是涉及到权限的问题.比如订单的业务只能VIP才能查看,所以这时 ...

随机推荐

  1. NOIP 2004 合唱队形

    洛谷 P1091 合唱队形 https://www.luogu.org/problemnew/show/P1091 JDOJ 1271: [NOIP2004]合唱队形 T3 https://neooj ...

  2. 怎么删除STL容器的元素

    在STL容器有顺序容器和关联容器两种. 顺序容器删除元素的方法有两种: 1.c.erase(p) 从c中删除迭代器p指定的元素.p必须指向c中一个真实元素,不能等于c.end().返回一个指向p之后元 ...

  3. Spring Cloud Zuul记录接口响应数据

    系统在生产环境出现问题时,排查问题最好的方式就是查看日志了,日志的记录尽量详细,这样你才能快速定位问题. 如果需要在Zuul中进行详细的日志记录,这两种日志必不可少. API请求信息 API响应信息 ...

  4. web版聊天功能简单实现

    一.问题 核心点:如何找到要发送的人? 要完成一个功能我觉得首先要分析该功能的逻辑及技术难点,而不是盲目的直接就撸代码,这样非常浪费时间.个人觉得web版聊天功能没什么实际应用场景,以前看过中国移动好 ...

  5. 一张图入门Python【中文版】

    好久没写了,就拿这张图作为开篇吧,重新梳理自己学习的东西,最近两年人工智能炒红了python,devops的提出也把开发.运维整合到了一起,作为一个运维工程师,随着企业自动化运维的提出,光会shell ...

  6. prometheus exporter简介

    一.服务分类 在线服务:请求的客户端和发起者需要立即响应(高并发.低延迟:并发数.接口响应时间.错误数.延迟时间),面对突发流量能进行资源的自动伸缩 离线服务:请求发送到服务端但不要求立即获取结果(监 ...

  7. Unity C# File类 本地数据保存和游戏存档

    进行本地数据存档和载入在游戏开发中非常常见,几乎任何一款游戏都需要这样的功能. 命名空间: using System.IO; 主要用于引入File类以处理各类文件操作. using System.Ru ...

  8. Centos6 No CMAKE_CXX_COMPILER could be found

    [1]问题现象 cmake发生异常:如下图所示 [2]问题分析 Centos6 上使用Cmake出现错误 "No CMAKE_CXX_COMPILER could be found.&quo ...

  9. Prometheus 告警状态了解

    Prometheus 告警状态了解 一旦这些警报存储在Alertmanager,它们可能处于以下任何状态: · Inactive:这里什么都没有发生. · Pending:已触发阈值,但未满足告警持续 ...

  10. 一、hexo+github搭建个人博客的过程记录

    前提: 1.新建一个github仓库 2.安装配置Node.js 3.安装配置Git 前提 步骤1.新建一个github仓库 打开github网站,(注册)登录账号,新建一个仓库; 注:==仓库名称要 ...