赞
踩
可以在配置文件中设置默认的权限管理类;
REST_FRAMEWORK = {
"DATETIME_FORMAT": "%Y-%m-%d %H:%M:%S", # 日期时间格式配置
"DATE_FORMAT": "%Y-%m-%d",
"DEFAULT_PERMISSION_CLASSES": [
"rest_framework.permissions.IsAuthenticated", # 只有经过身份认证确定用户身份才能访问
# 'rest_framework.permissions.IsAdminUser', # is_staff=True才能访问 —— 管理员(员工)权限
# 'rest_framework.permissions.AllowAny', # 允许所有
# 'rest_framework.permissions.IsAuthenticatedOrReadOnly', # 有身份 或者 只读访问(self.list,self.retrieve)
],
}
如果未指定,则采用如下默认配置
REST_FRAMEWORK = {
"DATETIME_FORMAT": "%Y-%m-%d %H:%M:%S", # 日期时间格式配置
"DATE_FORMAT": "%Y-%m-%d",
"DEFAULT_PERMISSION_CLASSES": [
#"rest_framework.permissions.IsAuthenticated", # 只有经过身份认证确定用户身份才能访问
# 'rest_framework.permissions.IsAdminUser', # is_staff=True才能访问 —— 管理员(员工)权限
'rest_framework.permissions.AllowAny', # 允许所有
# 'rest_framework.permissions.IsAuthenticatedOrReadOnly', # 有身份 或者 只读访问(self.list,self.retrieve)
],
}
也可以在具体的视图中通过 permission_classes 属性
from rest_framework.authentication import SessionAuthentication,BasicAuthentication
from rest_framework.permissions import IsAuthenticated
class BookModelViewSet(ModelViewSet):
authentication_classes = (SessionAuthentication,BasicAuthentication) # 认证
permission_classes = (IsAuthenticated)# 权限
如需要自定义权限,需要基础 rest_framework.permissions.BasePermission 父类,并实现一下两个任何一个方法或全部
是否可用访问视图 view 表示当前视图对象;返回True则可用访问当前视图中的所有方法。当返回False则当前视图中的所有方法都不能访问。
是否可用访问数据对象,view 表示当前视图,obj 为数据对象
''' models.py ''' class ApiWhiteList(CoreModel): url = models.CharField(max_length=200, help_text="url地址", verbose_name="url") METHOD_CHOICES = ( (0, "GET"), (1, "POST"), (2, "PUT"), (3, "DELETE"), ) method = models.IntegerField(default=0, verbose_name="接口请求方法", null=True, blank=True, help_text="接口请求方法") enable_datasource = models.BooleanField(default=True, verbose_name="激活数据权限", help_text="激活数据权限", blank=True) class Meta: db_table = table_prefix + "api_white_list" verbose_name = "接口白名单" verbose_name_plural = verbose_name ordering = ("-create_datetime",)
import re
from django.contrib.auth.models import AnonymousUser
from django.db.models import F
from rest_framework.permissions import BasePermission
from .models import ApiWhiteList
class CustomPermission(BasePermission):
"""自定义权限"""
def has_permission(self, request, view):
if isinstance(request.user, AnonymousUser):
return False
# 判断是否是超级管理员
if request.user.is_superuser:
return True
else: # 增加自定义逻辑
return False
使用
from django.db.models import Q
from rest_framework.viewsets import ModelViewSet
from rest_framework.decorators import action
from rest_framework.authentication import SessionAuthentication,BasicAuthentication
from rest_framework.permissions import IsAuthenticated
from .serializers import BookSerializer
from .models import Book
from rest_framework.response import Response
class BookModelViewSet(ModelViewSet):
authentication_classes = [ssionAuthentication,BasicAuthentication]
permission_classes = [IsAuthenticated,CustomPermission] # IsAuthenticated 登录后才能访问就必须增加 IsAuthenticated
queryset = Book.objects.all()
serializer_class = BookSerializer
可以对接口访问的频次进行限制,以减轻服务器压力。
可以在配置文件中,使用 DEFAULT_THROTTLE_CLASSES 和 DEFAULT_THROTTLE_RATES 进行全局配置
REST_FRAMEWORK = {
# 限流
"DEFAULT_THROTTLE_CLASSES":(
'rest_framework.throttling.AnonRateThrottle',# 限制所有匿名未认证用户,使用IP区分用户
'rest_framework.throttling.UserRateThrottle',# 限制认证用户,使用 UserId 来区分
),
"DEFAULT_THROTTLE_RATES":{ # 限流频次
'anon':'100/day',# 匿名用户一天 100 次 second,minute,hour ,day
'user':'1000/day',# 认证用户一天 1000 次 second,minute,hour ,day
}
}
DEFAULT_THROTTLE_RATES 可以使用 second,minute,hour 或day 来指明周期
也可以在具体视图中通过 throttle_classess 属性来配置,如
from rest_framework.throttling import UserRateThrottle
from rest_framework.views import APIView
class ExampleView(APIView):
throttle_classes = (UserRateThrottle)
...
限制所有匿名未认证用户,使用IP区分用户。
使用 DEFAULT_THROTES[‘anon’] 来设置 频次
限制认证用户,使用 UserId 来区分
使用 DEFAULT_THROTTLE_RATES[‘user’] 来设置频次
限制用户对于每个视图的防问频次,使用 ip或user id
class ContactListView(APIView):
throttle_scope = 'contacts'
...
class ContactDrtaiView(APIView):
throttle_scope = 'uploads'
...
REST_FRAMEWORK = {
# 限流
"DEFAULT_THROTTLE_CLASSES":(
'rest_framework.throttling.ScopedRateThrottle',
),
"DEFAULT_THROTTLE_RATES":{ # 限流频次
'contacts':'1/minute',
'uploads':'1/minute',
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。