drf06 认证Authentication 权限Permissions 限流Throttling

本文详细介绍了在Django REST框架中如何配置权限和限流,包括全局和局部设置,以及自定义权限的方法。同时,文章还提供了如何使用Django内置admin站点和配置认证方案的指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了方便接下来的学习,我们创建一个新的子应用 four

python manage.py startapp four

 

因为接下来的功能中需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员.

python manage.py createsuperuser

创建管理员以后,访问admin站点,先修改站点的语言配置

settings.py

 

访问admin 站点效果:

 

 

1. 认证Authentication

rest_framework.settings里面有默认的全局配置,不过我们可以在自己项目的setting.py文件中进行配置覆盖

可以在配置文件中(项目中的setting.py)配置全局默认的认证方案

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',  # session认证
        'rest_framework.authentication.BasicAuthentication',   # 基本认证
    )
}

 

也可以在每个视图中通过设置authentication_classess属性来设置(局部)

from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.views import APIView
​
class ExampleView(APIView):
    # 类属性
    authentication_classes = [SessionAuthentication, BasicAuthentication]
    ...

 

认证失败会有两种可能的返回值:

  • 401 Unauthorized 未认证

  • 403 Permission Denied 权限被禁止

 

 

 

2. 权限Permissions

权限控制可以限制用户对于视图的访问和对于具体数据对象的访问。

  • 在执行视图的dispatch()方法前,会先进行视图访问权限的判断

  • 在通过get_object()获取具体对象时,会进行模型对象访问权限的判断

使用

可以在配置文件(项目中的setting.py)中全局设置默认的权限管理类,如

REST_FRAMEWORK = {
    ....
    
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    )
}

 

如果未指明,则采用如下(rest_framework.settings默认配置

'DEFAULT_PERMISSION_CLASSES': (
   'rest_framework.permissions.AllowAny',
)

 

也可以在具体的视图中通过permission_classes属性来设置(局部),如

from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
​
class ExampleView(APIView):
    permission_classes = (IsAuthenticated,)
    ...

 

提供的权限

  • AllowAny 允许所有用户

  • IsAuthenticated 仅通过认证的用户

  • IsAdminUser 仅管理员用户

  • IsAuthenticatedOrReadOnly 已经登陆认证的用户可以对数据进行增删改操作,没有登陆认证的只能查看数据。

举例

from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import AllowAny,IsAdminUser,IsAuthenticated

class ExampleAPIView(APIView):
    authentication_classes = [SessionAuthentication]
    permission_classes = [IsAuthenticated]
    def get(self,request):
        print( type( request.user ) )
        return Response({"message":"ok"})

 

 

自定义权限

如需自定义权限,需继承rest_framework.permissions.BasePermission父类,并实现以下两个任何一个方法或全部

  • .has_permission(self, request, view)

    是否可以访问视图, view表示当前视图对象

  • .has_object_permission(self, request, view, obj)

    是否可以访问数据对象, view表示当前视图, obj为数据对象

例如:

在当前子应用下,创建一个权限文件permissions.py中声明自定义权限类:

from rest_framework.permissions import BasePermission
​
class IsXiaoMingPermission(BasePermission):
    def has_permission(self, request, view):
        if( request.user.username == "xiaoming" ):
            return True
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import AllowAny,IsAdminUser,IsAuthenticated

from .permissions import IsXiaoMingAuthentication

class ExampleAPIView(APIView):
    authentication_classes = [SessionAuthentication]
    permission_classes = [IsXiaoMingAuthentication]
    def get(self,request):
        print( type( request.user ) )
        return Response({"message":"ok"})

3. 限流Throttling

可以对接口访问的频次进行限制,以减轻服务器压力。

一般用于付费购买次数,投票等场景使用.

使用

可以在配置文件中,使用DEFAULT_THROTTLE_CLASSESDEFAULT_THROTTLE_RATES进行全局配置,

REST_FRAMEWORK = {
    # 限流[全局]
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.AnonRateThrottle', # 匿名用户,游客
        'rest_framework.throttling.UserRateThrottle'  # 已经经过认证的用户
    ),
    'DEFAULT_THROTTLE_RATES': {
        'anon': '300/minute',
        'user': '1000/minute'
    },
}

 

DEFAULT_THROTTLE_RATES 可以使用 second, minute, hourday来指明周期。

也可以在具体视图中通过throttle_classess属性来配置,如

from rest_framework.throttling import UserRateThrottle
from rest_framework.views import APIView
​
class ExampleView(APIView):
    throttle_classes = (UserRateThrottle,)
    ...

 

可选限流类

1) AnonRateThrottle

限制所有匿名未认证用户,使用IP区分用户。

使用DEFAULT_THROTTLE_RATES['anon'] 来设置频次

2)UserRateThrottle

限制认证用户,使用User id 来区分。

使用DEFAULT_THROTTLE_RATES['user'] 来设置频次

3)ScopedRateThrottle

限制用户对于每个视图的访问频次,使用ip或user id。

例如:

class ContactListView(APIView):
    throttle_scope = 'contacts'
    ...
​
class ContactDetailView(APIView):
    throttle_scope = 'contacts'
    ...
​
class UploadView(APIView):
    throttle_scope = 'uploads'
    ...
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.ScopedRateThrottle',
    ),
    'DEFAULT_THROTTLE_RATES': {
        'contacts': '1000/day',
        'uploads': '20/day'
    }
}

 

实例

全局配置中设置访问频率

 'DEFAULT_THROTTLE_RATES': {
        'anon': '3/minute',
        'user': '10/minute'
    }
 

from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.generics import RetrieveAPIView
from rest_framework.throttling import UserRateThrottle
​
class StudentAPIView(RetrieveAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    authentication_classes = [SessionAuthentication]
    permission_classes = [IsAuthenticated]
    throttle_classes = (UserRateThrottle,)

 

 

 

转载于:https://www.cnblogs.com/linux985/p/11017198.html

<think>好的,我现在需要帮助用户了解在前后端分离架构中使用Django Rest Framework(DRF)实现限流功能的方案。首先,我得回顾一下DRF限流机制,确保自己理解正确。限流主要是为了防止API被滥用,确保服务的稳定性,这在前后端分离的项目中尤为重要,因为前端可能频繁调用API。 首先,用户提到的是前后端分离的情况,所以需要确保限流设置会影响到前端正常的请求,同时能有效阻止恶意或过量的请求。根据引用[2],DRF提供了内置的限流组件,包括AnonRateThrottle和UserRateThrottle,分别用于匿名用户和认证用户。这可能是一个起点。 接下来,我需要考虑如何配置这些限流类。在settings.py中,应该添加DEFAULT_THROTTLE_CLASSES和DEFAULT_THROTTLE_RATES。例如,设置匿名用户每分钟10次,认证用户每分钟100次。同时,要确保已经配置了认证权限,因为限流通常在认证之后处理。引用[3]提到了使用JWT进行认证,可能需要结合djangorestframework-simplejwt包,但限流本身直接依赖JWT,而是依赖DRF认证机制。 然后,可能需要自定义限流策略。比如,针对同的视图或API端点设置同的频率限制。例如,关键API限制严格一些,其他则宽松。这里需要覆盖视图的throttle_classes属性,或者使用ScopedRateThrottle,根据作用域来设置。 另外,用户可能需要了解如何测试限流是否生效。可以通过频繁发送请求并检查返回的429状态码来验证。此外,处理限流时的响应信息也很重要,需要友好地提示用户,比如返回JSON数据包含错误信息和重试时间。 还需要注意DRF限流是基于缓存机制的,所以必须配置缓存后端,比如使用Memcached或Redis,而是默认的本地内存缓存,特别是在生产环境中。引用[2]中提到限流技术防止API滥用,所以正确的缓存配置是关键。 可能用户会遇到的常见问题包括限流配置未生效,这时候需要检查中间件的顺序,确保认证权限类已正确配置,以及缓存是否正常工作。另外,如果使用多个限流类,DRF会取所有限流中最严格的那个,这点需要注意。 最后,应该提到监控和日志记录,帮助追踪限流事件,分析流量模式,进一步优化限流策略。例如,使用Django的日志模块记录被限流的请求,或者集成监控工具如Prometheus。 总结一下,实现步骤应该是:安装必要包,配置认证权限,设置限流类和频率,可选自定义策略,测试验证,处理响应,配置缓存,以及监控。确保每一步都清晰,并参考DRF文档和引用中的信息来确保正确性。</think>在前后端分离架构中,使用Django Rest Framework (DRF) 实现API限流功能可通过以下步骤完成: ### 一、DRF限流核心配置 1. **安装依赖** 确保已安装`djangorestframework`和缓存依赖(如Redis): ```bash pip install djangorestframework redis ``` 2. **基础配置** 在`settings.py`中添加限流配置: ```python REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES': [ 'rest_framework.throttling.AnonRateThrottle', # 匿名用户限流 'rest_framework.throttling.UserRateThrottle' # 认证用户限流 ], 'DEFAULT_THROTTLE_RATES': { 'anon': '10/minute', # 匿名用户每分钟10次 'user': '100/minute' # 认证用户每分钟100次 } } ``` 需确保`rest_framework`已加入`INSTALLED_APPS`[^2]。 ### 二、结合认证机制 1. **配置JWT认证** 若使用JWT(推荐方案),需安装`djangorestframework-simplejwt`并配置: ```python REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ) } ``` 通过JWT令牌中的用户信息实现精准限流[^3]。 ### 三、自定义限流策略 1. **视图级限流** 在特定视图中覆盖默认配置: ```python from rest_framework.throttling import ScopedRateThrottle class SensitiveAPIView(APIView): throttle_classes = [ScopedRateThrottle] throttle_scope = 'sensitive' # 自定义作用域 ``` 在`settings.py`中补充速率: ```python 'DEFAULT_THROTTLE_RATES': { 'sensitive': '3/minute' # 敏感接口每分钟3次 } ``` 2. **动态频率控制** 通过继承`SimpleRateThrottle`实现基于请求参数的动态限流: ```python class IPThrottle(throttling.SimpleRateThrottle): scope = 'ip' def get_cache_key(self, request, view): return self.get_ident(request) # 基于客户端IP限流 ``` ### 四、生产环境优化 1. **缓存配置** 使用Redis作为限流计数器存储(需安装`django-redis`): ```python CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/1", } } ``` 2. **限流响应优化** 自定义超过频率限制时的响应格式: ```python class CustomThrottle(throttling.UserRateThrottle): def wait(self): return self.num_requests / self.duration # 返回剩余等待时间 def throttle_failure(self): data = { "code": 429, "message": f"请求过快,请{self.wait():.1f}秒后重试" } raise throttling.Throttled(detail=data) ``` ### 五、验证与测试 1. **使用DRF测试客户端** ```python from rest_framework.test import APIClient client = APIClient() for _ in range(11): response = client.get('/api/sensitive-data/') print(response.status_code) # 第11次应返回429 ``` 2. **监控限流日志** 在`settings.py`中添加日志记录: ```python LOGGING = { 'loggers': { 'django.throttle': { 'handlers': ['file'], 'level': 'INFO', 'propagate': True, } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值