Django rest framework ---- 权限
Django rest framework ---- 权限
添加权限
api/utils文件夹下新建premission.py文件,代码如下:
- message是当没有权限时,提示的信息
- # FileName : permission.py
- # Author : Adil
- # DateTime : 2019/7/30 5:14 PM
- # SoftWare : PyCharm
- from rest_framework.permissions import BasePermission
- class SVIPPermission(object):
- message = '必须是SVIP才能访问!'
- def has_permission(self,request,view):
- if request.user.user_type !=3:
- return False
- return True
- class MyPermission(object):
- def has_permission(self,request,view):
- if request.user.user_type == 3:
- return False
- return True
settings.py全局配置权限
- #设置全局认证
- REST_FRAMEWORK = {
- "DEFAULT_AUTHENTICATION_CLASSES":['api.utils.auth.Authentication',], #里面写你的认证的类的路径
- "DEFAULT_PERMISSION_CLASSES":['api.utils.permission.SVIPPermission',], # 添加权限路径
- }
views.py添加权限
- 默认所有的业务都需要SVIP权限才能访问
- OrderView类里面没写表示使用全局配置的SVIPPremission
- UserInfoView类,因为是普通用户和VIP用户可以访问,不使用全局的,要想局部使用的话,里面就写上自己的权限类
- permission_classes = [MyPremission,] #局部使用权限方法
- from django.shortcuts import render
- # Create your views here.
- import time
- from api import models
- from django.http import JsonResponse
- from rest_framework.views import APIView
- from rest_framework.request import Request
- from rest_framework import exceptions
- from rest_framework.authentication import BasicAuthentication
- from django.shortcuts import render,HttpResponse
- from api.utils.permission import SVIPPermission,MyPermission
- ORDER_DICT = {
- 1:{
- 'name':'apple',
- 'price':15
- },
- 2:{
- 'name':'orange',
- 'price':30
- }
- }
- def md5(user):
- import hashlib
- import time
- ctime = str(time.time())
- print(ctime)
- m = hashlib.md5(bytes(user,encoding='utf-8'))
- print(m)
- m.update(bytes(ctime,encoding='utf-8'))
- print(m)
- usertoken = m.hexdigest()
- print(usertoken)
- return usertoken
- class AuthView(APIView):
- authentication_classes = [] # 里面为空,代表不需要认证
- permission_classes = []
- def post(self,request,*args,**kwargs):
- print('参数',request)
- ret = {'code':1000,'msg':None,'token':None}
- try:
- # 参数是datadict 形式
- usr = request.data.get('username')
- pas = request.data.get('password')
- # usr = request._request.POST.get('username')
- # pas = request._request.POST.get('password')
- # usr = request.POST.get('username')
- # pas = request.POST.get('password')
- print(usr)
- print(pas)
- # obj = models.User.objects.filter(username='yang', password='123456').first()
- obj = models.User.objects.filter(username=usr,password=pas).first()
- # obk =models.userToken.objects.filter(token='9c979c316d4ea42fd998ddf7e8895aa4').first()
- # print(obk.token)
- print('******')
- print(obj)
- print(type(obj))
- print(obj.username)
- print(obj.password)
- if not obj:
- ret['code'] = ''
- ret['msg'] = '用户名或者密码错误'
- return JsonResponse(ret)
- # 里为了简单,应该是进行加密,再加上其他参数
- # token = str(time.time()) + usr
- token = md5(usr)
- print(token)
- models.userToken.objects.update_or_create(user=obj, defaults={'token': token})
- ret['token'] = token
- ret['msg'] = '登录成功'
- #ret['token'] = token
- except Exception as e:
- ret['code'] = 1002
- ret['msg'] = '请求异常'
- return JsonResponse(ret)
- class OrderView(APIView):
- '''订单业务'''
- # authentication_classes = []
- # permission_classes = []
- def get(self,request,*args,**kwargs):
- print("~~~~~~")
- print(request.user)
- print(request.auth)
- print("~~~~~~")
- ret = {'code':1000,'msg':None,'data':None}
- try:
- ret['data'] = ORDER_DICT
- except Exception as e:
- pass
- return JsonResponse(ret)
- class UserInfoView(APIView):
- '''
- 订单相关业务(普通用户和VIP用户可以看)
- '''
- permission_classes = [MyPermission,] #不用全局的权限配置的话,这里就要写自己的局部权限
- def get(self,request,*args,**kwargs):
- print(request.user)
- return HttpResponse('用户信息')
- # if __name__ == '__main__':
- #
- # md5('yang')
urls
- """logintest URL Configuration
- The `urlpatterns` list routes URLs to views. For more information please see:
- https://docs.djangoproject.com/en/2.1/topics/http/urls/
- Examples:
- Function views
- 1. Add an import: from my_app import views
- 2. Add a URL to urlpatterns: path('', views.home, name='home')
- Class-based views
- 1. Add an import: from other_app.views import Home
- 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
- Including another URLconf
- 1. Import the include() function: from django.urls import include, path
- 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
- """
- from django.contrib import admin
- from django.urls import path
- from django.conf.urls import url
- from api.views import AuthView
- from api.views import OrderView,UserInfoView
- from api.appview.register import registerView
- from django.views.generic.base import TemplateView # 1、增加该行
- urlpatterns = [
- path('admin/', admin.site.urls),
- path(r'',TemplateView.as_view(template_name='index.html')), #2、 增加该行
- url(r'^api/v1/auth/$', AuthView.as_view()),
- url(r'^api/v1/order/$', OrderView.as_view()), # 权限
- url(r'^api/v1/info/',UserInfoView.as_view()), # 权限
- url(r'^home/register/$', registerView.as_view()),
- ]
测试
普通用户访问OrderView,提示没有权限
普通用户访问UserInfoView,可以返回信息
内置权限
django-rest-framework内置权限BasePermission
默认是没有限制权限
- class BasePermission(object):
- """
- A base class from which all permission classes should inherit.
- """
- 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
我们自己写的权限类,应该去继承BasePermission,修改之前写的permission.py文件
- # utils/permission.py
- from rest_framework.permissions import BasePermission
- class SVIPPremission(BasePermission):
- message = "必须是SVIP才能访问"
- def has_permission(self,request,view):
- if request.user.user_type != 3:
- return False
- return True
- class MyPremission(BasePermission):
- def has_permission(self,request,view):
- if request.user.user_type == 3:
- return False
- return True
总结:
(1)使用
- 自己写的权限类:1.必须继承BasePermission类; 2.必须实现:has_permission方法
(2)返回值
- True 有权访问
- False 无权访问
(3)局部
- permission_classes = [MyPremission,]
(4)全局
- REST_FRAMEWORK = {
- #权限
- "DEFAULT_PERMISSION_CLASSES":['api.utils.permission.SVIPPremission'],
- }
Django rest framework ---- 权限的更多相关文章
- Django REST framework - 权限和限制
目录 Django REST framework 权限和限制 (你能干什么) 设置权限的方法 案例 第一步: 定义一个权限类 第二步: 使用 视图级别 全局级别设置 --- 限制 (你一分钟能干多少次 ...
- django rest framework权限和认证
Django rest framework之权限 一.Authentication用户认证配置 1.四种验证及官网描述: BasicAuthentication 此身份验证方案使用HTTP基本身份验证 ...
- Django rest framework 权限操作(源码分析)
知识回顾http://www.cnblogs.com/ctztake/p/8419059.html 这一篇是基于上一篇写的,上一篇谢了认证的具体流程,看懂了上一篇这一篇才能看懂, 当用户访问是 首先执 ...
- Django REST framework —— 权限组件源码分析
在上一篇文章中我们已经分析了认证组件源码,我们再来看看权限组件的源码,权限组件相对容易,因为只需要返回True 和False即可 代码 class ShoppingCarView(ViewSetMix ...
- Django rest framework源码分析(2)----权限
目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...
- 04 Django REST Framework 认证、权限和限制
目前,我们的API对谁可以编辑或删除代码段没有任何限制.我们希望有更高级的行为,以确保: 代码片段始终与创建者相关联. 只有通过身份验证的用户可以创建片段. 只有代码片段的创建者可以更新或删除它. 未 ...
- Django Rest Framework(认证、权限、限制访问频率)
阅读原文Django Rest Framework(认证.权限.限制访问频率) django_rest_framework doc django_redis cache doc
- Django Rest framework 之 权限
django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) django res ...
- Django Rest Framework源码剖析(二)-----权限
一.简介 在上一篇博客中已经介绍了django rest framework 对于认证的源码流程,以及实现过程,当用户经过认证之后下一步就是涉及到权限的问题.比如订单的业务只能VIP才能查看,所以这时 ...
随机推荐
- NOIP 2004 合唱队形
洛谷 P1091 合唱队形 https://www.luogu.org/problemnew/show/P1091 JDOJ 1271: [NOIP2004]合唱队形 T3 https://neooj ...
- 怎么删除STL容器的元素
在STL容器有顺序容器和关联容器两种. 顺序容器删除元素的方法有两种: 1.c.erase(p) 从c中删除迭代器p指定的元素.p必须指向c中一个真实元素,不能等于c.end().返回一个指向p之后元 ...
- Spring Cloud Zuul记录接口响应数据
系统在生产环境出现问题时,排查问题最好的方式就是查看日志了,日志的记录尽量详细,这样你才能快速定位问题. 如果需要在Zuul中进行详细的日志记录,这两种日志必不可少. API请求信息 API响应信息 ...
- web版聊天功能简单实现
一.问题 核心点:如何找到要发送的人? 要完成一个功能我觉得首先要分析该功能的逻辑及技术难点,而不是盲目的直接就撸代码,这样非常浪费时间.个人觉得web版聊天功能没什么实际应用场景,以前看过中国移动好 ...
- 一张图入门Python【中文版】
好久没写了,就拿这张图作为开篇吧,重新梳理自己学习的东西,最近两年人工智能炒红了python,devops的提出也把开发.运维整合到了一起,作为一个运维工程师,随着企业自动化运维的提出,光会shell ...
- prometheus exporter简介
一.服务分类 在线服务:请求的客户端和发起者需要立即响应(高并发.低延迟:并发数.接口响应时间.错误数.延迟时间),面对突发流量能进行资源的自动伸缩 离线服务:请求发送到服务端但不要求立即获取结果(监 ...
- Unity C# File类 本地数据保存和游戏存档
进行本地数据存档和载入在游戏开发中非常常见,几乎任何一款游戏都需要这样的功能. 命名空间: using System.IO; 主要用于引入File类以处理各类文件操作. using System.Ru ...
- Centos6 No CMAKE_CXX_COMPILER could be found
[1]问题现象 cmake发生异常:如下图所示 [2]问题分析 Centos6 上使用Cmake出现错误 "No CMAKE_CXX_COMPILER could be found.&quo ...
- Prometheus 告警状态了解
Prometheus 告警状态了解 一旦这些警报存储在Alertmanager,它们可能处于以下任何状态: · Inactive:这里什么都没有发生. · Pending:已触发阈值,但未满足告警持续 ...
- 一、hexo+github搭建个人博客的过程记录
前提: 1.新建一个github仓库 2.安装配置Node.js 3.安装配置Git 前提 步骤1.新建一个github仓库 打开github网站,(注册)登录账号,新建一个仓库; 注:==仓库名称要 ...