美文网首页
drf认证.权限.节流.版本.解析器

drf认证.权限.节流.版本.解析器

作者: WANGLIN_HZ | 来源:发表于2019-05-07 20:09 被阅读0次

    认证

    1.首先执行dispatch方法
    2.重新封装Request
    3.initial(request)方法里面有各种封装函数
    4.其中perform_authentication(request)是公认的函数
    5.返回一个request.user
    6.def _authenticate():循环所有的authentication对象,执行authenticate方法
    7.Authtication 自定义认证类
    def authenticate():
    自定义认证
    -报错
    -返回元组(request.user, request.auth)


    权限

    1.使用
    类,必须继承:BasePermission,必须实现:has_permission方法

    from rest_framework.permissions import BasePermission
    
    class SVIPPermission(BasePermission):
        message = "会员SVIP"
        dehas_permission(self,request,view):
            if request.useuser_type != 3:
                return False
            return True
    

    返回值:

    • True:有权访问
    • False:无权访问

    局部

    class UserInfoView(APIView):
       
        permission_classes = [MyPermission1, ]
    
        def get(self,request,*args,**kwargs):
            return HttpResponse('用户信息')
    

    全局

    REST_FRAMEWORK = {
    "DEFAULT_PERMISSION_CLASSES":['api.utils.permission.SVIPPermission']
    }
    

    节流

    一旦一个用户向资源发送请求,那么根据用户的身份就有两种情况,匿名用户和认证用户,怎么用用户的身份做限制,要找到用户的唯一标识

    • 匿名用户:对于匿名用户,唯一能用来标识的只有请求的IP

    • 认证用户:认证用户的用户名,或者用户ID等
      用户标识的问题解决啦,假如设置的是每分钟只能访问五次,也就是5次/min.当用户发送请求,可以拿到用户的唯一标识,判断用户第几次访问

    • 目录结构:
      1.在utils包中定义限流组件
      2.具体限制访问
      3.配置限流类(可以在setting.py中全局配置,也可以在视图重写,局部配置,但是访问频率需要限流类的scope属性定义,对于匿名用户,每分钟访问五次,认证用户,每分钟五次)
      4.视图
      5.请求测试(使用postman或者浏览器发送请求
      一分钟连续发送5次,正常发送第六次时,访问受限)


    版本

    自定义版本控制类

    class ParmasVersion(object):
                def determine_version(self, request, *args, **kwargs):
                version = request.query_params.get('version')
                return version
    

    使用局部

    class VersionView(APIView):
                versioning_class = ParmasVersion
    

    全局设置

    'DEFAULT_VERSIONING_CLASS':'unitls.version.ParmasVersion',
    

    使用 DRF内置的版本控制类QueryParameterVersioning(局部)

    from rest_framework.versioning import QueryParameterVersioning
            class VersionView(APIView):
                versioning_class = QueryParameterVersioning
    

    设置文件中的配置信息

    REST_FRAMEWORK = {
            'VERSION_PARAM':'version',
            'DEFAULT_VERSION':'v1',
            'ALLOWED_VERSIONS':['v1','v2'],
            }
    

    全局设置

    REST_FRAMEWORK = {
            'VERSION_PARAM':'version',
            'DEFAULT_VERSION':'v1',
            'ALLOWED_VERSIONS':['v1','v2'],
            'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.QueryParameterVersioning',
            }
    

    使用 DRF内置的版本控制类URLPathVersioning(局部)

    from rest_framework.versioning import URLPathVersioning
            class VersionView(APIView):
            versioning_class = URLPathVersioning
    

    设置文件中的配置文件

    REST_FRAMEWORK = {
            'VERSION_PARAM':'version',
            'DEFAULT_VERSION':'v1',
            'ALLOWED_VERSIONS':['v1','v2'],
            }
    

    全局设置

    REST_FRAMEWORK = {
            'VERSION_PARAM':'version',
            'DEFAULT_VERSION':'v1',
            'ALLOWED_VERSIONS':['v1','v2'],
            'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning',
            }
    

    如果使用URLPathVersioning

    naurl(r"^(?P<version>[v1|v2]+)/version/",VersionView.as_view(me='vvvv')
    

    解析器

    1.本质

    • 请求头
    • 状态码
    • 请求方法
      2.源码流程
    • dispatch : request封装
    • request.data

    使用
    1.局部

    from rest_framework.parsers import FormParser,JSONParser
           class UserInfoView(APIView):
                parser_classes = [FormParser,JSONParser]
                #这时DRF 内部代码会根据request.Content-Type和解析器支持的media_type比较
                从而选择对应的解析器
                
                def post(self,request,*args,**kwargs):
                    # 如果使用JSONParser、FormParser解析数据的话
                    data = request.data
                    print(data)
    

    2.全局

    REST_FRAMEWORK = {
    "DEFAULT_PARSER_CLASSES":  ["rest_framework.JSONParser", "rest_framework.FormParser"]
    }
    

    相关文章

      网友评论

          本文标题:drf认证.权限.节流.版本.解析器

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