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 ---- 权限的更多相关文章

  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. Django之创建项目、目录层级、基本操作

    创建项目 在合适的位置创建一个目录 打开cmd窗口,进入到创建的目录内 输入django-admin startproject project 目录层级 manage.py 是一个命令行工具,可以使我 ...

  2. luoguP3455 [POI2007]ZAP-Queries

    题意 设\(f(n)=\sum\limits_{i=1}^{a}\sum\limits_{j=1}^{b}[gcd(i,j)==n],F(n)=\sum\limits_{n|d}f(d)\) 发现\( ...

  3. 使用教育邮箱免费申请JetBrains套装(IntelliJ, PhpStorm, WebStorm...)

    想下个PhpStorm来写php,发现可以使用教育账号白嫖. 申请步骤 打开 申请页面 ,点击 “APPLY NOW” 开始申请. 填写姓名,以及学校提供给你的邮箱(edu后缀邮箱,或.end.cn) ...

  4. mark-杭州互联网公司分布-位置信息

    项目内容: 在智联招聘上爬取杭州市互联网公司的位置信息,属于哪个区: 如果公司信息内不含区信息,则通过百度地图接口获取所属区信息 scrapy+pycharm

  5. 8.10 NOIP模拟测试16 Blue+Weed+Drink

    T1 Blue 贪心,每次跳得时候跳能跳到的最远的地方,跳过的就把他设为0,每次二分找到位置,一直跳就行,如果能跳到的位置就是当前位置或比当前位置还小(数组里现在呆着的这一块石头,二分得到的就是当前位 ...

  6. [HNOI2012]集合选数(构造,状态压缩,DP)

    神仙题. 莫名其妙的就试一试把所有数放进一个类似矩阵的东西里面. 首先把 \(1\) 放到左上角,然后在每个数的右边放它的 \(3\) 倍(大于 \(n\) 就不用放了),下面放它的 \(2\) 倍( ...

  7. shell脚本中“$?”标记的用途是什么?

    在写一个shell脚本时,如果你想要检查前一命令是否执行成功,在if条件中使用“$?”可以来检查前一命令的结束状态.

  8. 在 Vue 中使用 装饰器 Decorator

    Decorator 的语法还没有通过提案,所以项目中很少用.不过最近刚好有一个需求用到了. 装饰器的语法 http://es6.ruanyifeng.com/#docs/decorator 需求是,有 ...

  9. Navicat的安装和pymysql模块的使用

    内容回顾 select distinct 字段1,字段2,... from 表名 where 分组之前的过滤条件 group by 分组条件 having 分组之后过滤条件 order by 排序字段 ...

  10. 结合Spring实现策略模式

    最近系统需要对不同维度的数据进行差异化计算,也就会使用不同算法.为了以后更加容易扩展,结合Spring框架及策略模式对实现架构做了系统设计. 1. 定义策略接口(Strategy): import c ...