Django restframework 框架认证、权限、限流用法示例
本文实例讲述了Djangorestframework框架认证、权限、限流用法。分享给大家供大家参考,具体如下:
概述
DjangoRestFramework是一个强大且灵活的工具包,使用DjangoRESTFramework可以在Django的基础上迅速实现API,用以构建WebAPI。
认证Authentication
可以在配置文件中配置全局默认的认证方案
REST_FRAMEWORK={ 'DEFAULT_AUTHENTICATION_CLASSES':( 'rest_framework.authentication.BasicAuthentication',#基本认证 'rest_framework.authentication.SessionAuthentication',#session认证 ) }
也可以在每个视图中通过设置authentication_classess属性来设置
fromrest_framework.authenticationimportSessionAuthentication,BasicAuthentication fromrest_framework.viewsimportAPIView classExampleView(APIView): authentication_classes=(SessionAuthentication,BasicAuthentication) ...
认证失败会有两种可能的返回值:
- 401Unauthorized未认证
- 403PermissionDenied权限被禁止
权限Permissions
权限控制可以限制用户对于视图的访问和对于具体数据对象的访问。
- 在执行视图的dispatch()方法前,会先进行视图访问权限的判断
- 在通过get_object()获取具体对象时,会进行对象访问权限的判断
使用
可以在配置文件中设置默认的权限管理类,如
REST_FRAMEWORK={ 'DEFAULT_PERMISSION_CLASSES':( 'rest_framework.permissions.IsAuthenticated', ) }
如果未指明,则采用如下默认配置
'DEFAULT_PERMISSION_CLASSES':( 'rest_framework.permissions.AllowAny', )
也可以在具体的视图中通过permission_classes属性来设置,如
fromrest_framework.permissionsimportIsAuthenticated fromrest_framework.viewsimportAPIView classExampleView(APIView): permission_classes=(IsAuthenticated,) ...
提供的权限
- AllowAny允许所有用户
- IsAuthenticated仅通过认证的用户
- IsAdminUser仅管理员用户
- IsAuthenticatedOrReadOnly认证的用户可以完全操作,否则只能get读取
举例
fromrest_framework.authenticationimportSessionAuthentication fromrest_framework.permissionsimportIsAuthenticated fromrest_framework.genericsimportRetrieveAPIView classBookDetailView(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为数据对象
例如:
classMyPermission(BasePermission): defhas_object_permission(self,request,view,obj): """控制对obj对象的访问权限,此案例决绝所有对对象的访问""" returnFalse classBookInfoViewSet(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_classess属性来配置,如
fromrest_framework.throttlingimportUserRateThrottle fromrest_framework.viewsimportAPIView classExampleView(APIView): throttle_classes=(UserRateThrottle,) ...
可选限流类
1)AnonRateThrottle
限制所有匿名未认证用户,使用IP区分用户。
使用DEFAULT_THROTTLE_RATES['anon']来设置频次
2)UserRateThrottle
限制认证用户,使用Userid来区分。
使用DEFAULT_THROTTLE_RATES['user']来设置频次
3)ScopedRateThrottle
限制用户对于每个视图的访问频次,使用ip或userid。
例如:
classContactListView(APIView): throttle_scope='contacts' ... classContactDetailView(APIView): throttle_scope='contacts' ... classUploadView(APIView): throttle_scope='uploads' ... REST_FRAMEWORK={ 'DEFAULT_THROTTLE_CLASSES':( 'rest_framework.throttling.ScopedRateThrottle', ), 'DEFAULT_THROTTLE_RATES':{ 'contacts':'1000/day', 'uploads':'20/day' } }
实例
fromrest_framework.authenticationimportSessionAuthentication fromrest_framework.permissionsimportIsAuthenticated fromrest_framework.genericsimportRetrieveAPIView fromrest_framework.throttlingimportUserRateThrottle classBookDetailView(RetrieveAPIView): queryset=BookInfo.objects.all() serializer_class=BookInfoSerializer authentication_classes=[SessionAuthentication] permission_classes=[IsAuthenticated] throttle_classes=(UserRateThrottle,)
希望本文所述对大家基于Django框架的Python程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。