美文网首页
Django -rest-framework

Django -rest-framework

作者: _Caesar | 来源:发表于2018-04-09 23:18 被阅读99次

    出现的原因

    基于django实现的APi很多功能都是自己开发,这时候djangorestframework就给我们提供了方便,直接基于它来返回数据,总之原理一样的,就是给一个接口也就是url,让前端的人请求url获取数据,在页面上显示出来,这样也达到前后端分离的效果。

    认证

    应用:主要用token验证 url中as_view里面调用dispatch方法
    局部使用
    全局使用

    • settings
    #注册认证类
    REST_FRAMEWORK = {
        'UNAUTHENTICATED_USER': None,
        'UNAUTHENTICATED_TOKEN': None,  #将匿名用户设置为None
        "DEFAULT_AUTHENTICATION_CLASSES": [
            "app01.utils.MyAuthentication",
        ],
    }
    
    • 全局验证
    from  rest_framework.authentication import BaseAuthentication
    from rest_framework.exceptions import APIException
    from app02 import models
    
    
    class MyAuthentication(BaseAuthentication):
        def authenticate(self, request):
            token=request.query_params.get('token')
            print(token)
            obj=models.UserInfo.objects.filter(token=token).first()
            print(obj)
            if obj:
                return (obj.username,obj)
            raise  APIException('没有通过验证')
    全局验证
    

    权限

    1,需求:Host是匿名用户和用户都能访问#匿名用户的request.user=none;User只有注册用户能访问

    • urls.py
    from app03 import views
    from django.conf.urls import url
    urlpatterns = [
        # django rest framework
        url('^auth/', views.AuthView.as_view()),
        url(r'^hosts/', views.HostView.as_view()),
        url(r'^users/', views.UsersView.as_view()),
        url(r'^salary/', views.SalaryView.as_view()),
    ]
    urls.py
    
    • 认证和权限配合使用
    class SalaryView(APIView):
        '''用户能访问'''
        message ='无权访问'
        authentication_classes = [MyAuthentication,]  #验证是不是用户
        permission_classes = [MyPermission,AdminPermission,] #再看用户有没有权限,如果有权限在判断有没有管理员的权限
        def get(self,request):
            return Response('薪资列表')
    
        def permission_denied(self, request, message=None):
            """
            If request is not permitted, determine what kind of exception to raise.
            """
            if request.authenticators and not request.successful_authenticator:
                '''如果没有通过认证,并且权限中return False了,就会报下面的这个异常了'''
                raise exceptions.NotAuthenticated(detail='无权访问')
            raise exceptions.PermissionDenied(detail=message)
    
    • views
    from django.shortcuts import render
    from rest_framework.views import APIView  #继承的view
    from rest_framework.response import  Response #友好的返回
    from rest_framework.authentication import BaseAuthentication   #认证的类
    from rest_framework.authentication import BasicAuthentication
    from rest_framework.permissions import BasePermission
    from app01 import models
    from rest_framework import  exceptions
    from rest_framework.permissions import AllowAny   #权限在这个类里面
    from rest_framework.throttling import BaseThrottle,SimpleRateThrottle
    # Create your views here.
    # +++++++++++++++认证类和权限类========================
    class MyAuthentication(BaseAuthentication):
        def authenticate(self, request):
            token = request.query_params.get('token')
            obj = models.UserInfo.objects.filter(token=token).first()
            if obj :  #如果认证成功,返回用户名和auth
                return (obj.username,obj)
            return None  #如果没有认证成功就不处理,进行下一步
    
        def authenticate_header(self, request):
            pass
    
    class MyPermission(BasePermission):
        message = '无权访问'
        def has_permission(self,request,view):  #has_permission里面的self是view视图对象
            if request.user:
                return True  #如果不是匿名用户就说明有权限
            return False  #否则无权限
    
    class AdminPermission(BasePermission):
        message = '无权访问'
        def has_permission(self, request, view):  # has_permission里面的self是view视图对象
            if request.user=='haiyun':
                return True  # 返回True表示有权限
            return False #返回False表示无权限
    
    # +++++++++++++++++++++++++++
    class AuthView(APIView):
        authentication_classes = []  #认证页面不需要认证
    
        def get(self,request):
            self.dispatch
            return '认证列表'
    
    class HostView(APIView):
        '''需求:
              Host是匿名用户和用户都能访问  #匿名用户的request.user = none
              User只有注册用户能访问
        '''
        authentication_classes = [MyAuthentication,]
        permission_classes = []  #都能访问就没必要设置权限了
        def get(self,request):
            print(request.user)
            print(request.auth)
            print(111111)
            return Response('主机列表')
    
    class UsersView(APIView):
        '''用户能访问,request.user里面有值'''
        authentication_classes = [MyAuthentication,]
        permission_classes = [MyPermission,AdminPermission]
        def get(self,request):
            print(request.user,'111111111')
            return Response('用户列表')
    
        def permission_denied(self, request, message=None):
            """
            If request is not permitted, determine what kind of exception to raise.
            """
            if request.authenticators and not request.successful_authenticator:
                '''如果没有通过认证,并且权限中return False了,就会报下面的这个异常了'''
                raise exceptions.NotAuthenticated(detail='无权访问22222')
            raise exceptions.PermissionDenied(detail=message)
    
    
    class SalaryView(APIView):
        '''用户能访问'''
        message ='无权访问'
        authentication_classes = [MyAuthentication,]  #验证是不是用户
        permission_classes = [MyPermission,AdminPermission,] #再看用户有没有权限,如果有权限在判断有没有管理员的权限
        def get(self,request):
            return Response('薪资列表')
    
        def permission_denied(self, request, message=None):
            """
            If request is not permitted, determine what kind of exception to raise.
            """
            if request.authenticators and not request.successful_authenticator:
                '''如果没有通过认证,并且权限中return False了,就会报下面的这个异常了'''
                raise exceptions.NotAuthenticated(detail='无权访问')
            raise exceptions.PermissionDenied(detail=message)
    

    限流

    1为什么限流呢?
    第一点:爬虫反爬
    第二点:控制api访问次数
    登录用户的用户名可以做标识
    匿名用户可以参考ip,但是ip可以加代理

    总结

    认证:就是检查用户是否存在;如果存在返回(request.user,request.auth);不存在request.user/request.auth=NONE
    权限:进行职责划分
    限制访问频率

    认证
        - 类:authenticate/authenticate_header ##验证不成功的时候执行的
        - 返回值:
            - return None,
            - return (user,auth),
            - raise 异常
        - 配置:
            - 视图:
                class IndexView(APIView):
                    authentication_classes = [MyAuthentication,]
            - 全局:
                REST_FRAMEWORK = {
                        'UNAUTHENTICATED_USER': None,
                        'UNAUTHENTICATED_TOKEN': None,
                        "DEFAULT_AUTHENTICATION_CLASSES": [
                            # "app02.utils.MyAuthentication",
                        ],
                }
    
    权限 
        - 类:has_permission/has_object_permission
        - 返回值: 
            - True、#有权限
            - False、#无权限
            - exceptions.PermissionDenied(detail="错误信息")  #异常自己随意,想抛就抛,错误信息自己指定
        - 配置:
            - 视图:
                class IndexView(APIView):
                    permission_classes = [MyPermission,]
            - 全局:
                REST_FRAMEWORK = {
                        "DEFAULT_PERMISSION_CLASSES": [
                            # "app02.utils.MyAuthentication",
                        ],
                }
    限流
        - 类:allow_request/wait PS: scope = "wdp_user"
        - 返回值:
          return True、#不限制
          return False  #限制
        - 配置: 
                - 视图: 
                    class IndexView(APIView):
                        
                        throttle_classes=[AnonThrottle,UserThrottle,]
                        def get(self,request,*args,**kwargs):
                            self.dispatch
                            return Response('访问首页')
                - 全局
                    REST_FRAMEWORK = {
                        "DEFAULT_THROTTLE_CLASSES":[
                        
                        ],
                        'DEFAULT_THROTTLE_RATES':{
                            'wdp_anon':'5/minute',
                            'wdp_user':'10/minute',
                        }
                    }
    

    相关文章

      网友评论

          本文标题:Django -rest-framework

          本文链接:https://www.haomeiwen.com/subject/equshftx.html