Django REST Framework 认证、权限与限流配置详解
本文详细介绍 Django REST Framework 中认证、权限和限流的配置方法。涵盖全局与视图级设置,解析 AllowAny、IsAuthenticated 等内置权限类,演示自定义权限逻辑,并说明 AnonRateThrottle、UserRateThrottle 及 ScopedRateThrottle 限流策略的使用,帮助开发者构建安全高效的 Web API。
Django REST Framework 概述
本文通过具体示例,解析 Django REST Framework 框架中认证、权限及限流机制的实际应用,供读者参考学习。
概述
Django REST Framework 是一套功能强大且灵活的工具包,基于 Django 框架,可快速构建 Web API。
认证机制配置
认证 Authentication
用户可在配置文件中设定全局默认的认证方案。
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication', # 基本认证
'rest_framework.authentication.SessionAuthentication', # session认证
)
}
此外,也可在每个视图类中通过设置 authentication_classes 属性来指定特定的认证方式。
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,表示权限被禁止。
权限控制策略
权限 Permissions
权限控制用于限制用户对视图的访问权限以及对具体数据对象的访问权限。
- 在调用视图的 dispatch() 方法之前,系统会先执行视图级别的访问权限判断。
- 当通过 get_object() 获取具体数据对象时,系统会执行对象级别的访问权限判断。
使用
用户可在配置文件中设置默认的权限管理类,例如:
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
)
}
若未明确指定,系统将采用如下默认配置:
'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,认证用户可进行完整操作,未认证用户仅能进行 GET 读取操作。
示例
from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.generics import RetrieveAPIView
class BookDetailView(RetrieveAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
authentication_classes = [SessionAuthentication]
permission_classes = [IsAuthenticated]
自定义权限实现
自定义权限
如需实现自定义权限,需继承 rest_framework.permissions.BasePermission 父类,并实现以下一个或两个方法:
- .has_permission(self, request, view)
用于判断是否可访问视图,其中 view 参数表示当前视图对象。
- .has_object_permission(self, request, view, obj)
用于判断是否可访问数据对象,其中 view 表示当前视图,obj 表示数据对象。
示例代码如下:
class MyPermission(BasePermission):
def has_object_permission(self, request, view, obj):
"""控制对obj对象的访问权限,此案例决绝所有对对象的访问"""
return False
class BookInfoViewSet(ModelViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
permission_classes = [IsAuthenticated, MyPermission]
接口限流设置
限流 Throttling
限流机制可用于限制接口访问频率,从而减轻服务器压力。
使用
用户可在配置文件中,通过 DEFAULT_THROTTLE_CLASSES 和 DEFAULT_THROTTLE_RATES 进行全局配置。
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle'
),
'DEFAULT_THROTTLE_RATES': {
'anon': '100/day',
'user': '1000/day'
}
}
DEFAULT_THROTTLE_RATES 的值可使用 second、minute、hour 或 day 来指明时间周期。
用户也可在具体视图类中通过 throttle_classes 属性进行配置,例如:
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'
}
}
综合应用实例
完整实例
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 BookDetailView(RetrieveAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
authentication_classes = [SessionAuthentication]
permission_classes = [IsAuthenticated]
throttle_classes = (UserRateThrottle,)
希望本文所述内容对大家基于 Django 框架的 Python 程序设计有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













