首页 > 其他分享 >DRF组件--2

DRF组件--2

时间:2022-11-28 00:01:12浏览次数:42  
标签:return -- self request v1 classes 组件 DRF history

DRF组件--权限功能

自己定义一个权限类,其中必须包含has_permission方法

class MyPermission(object):     #创建一个权限类。里面写具体的权限划分
    def has_permission(self,request,view):
        if request.user.usertype == 3:
            return True             #如果返回ture,则说明拥有该权限
        return False

然后再视图函数中,配置permission_classes = [MyPermission,]列表。方法同认证功能一样,如果想要配置为全局,也是同认证一样,再settings里配置

BasePermission内置权限类。

 

 

节流(访问控制)

自定义一个访问控制类,其中必须包含allow_request方法和wait方法

#访问频率控制
import time
VISIT_RECORD={}     #存储用户的访问记录,将用户的ip作为key
class VisitThrottle(object):
    def __init__(self):
        self.history = None

    def allow_request(self,request,view):
        #获取用户ip
        remote_addr = request._request.META.get('REMOTE_ADDR')
        ctime = time.time()
        if remote_addr not in VISIT_RECORD:
            VISIT_RECORD[remote_addr] = [ctime,]
            return True
        history = VISIT_RECORD.get(remote_addr)
        self.history = history
        while history and history[-1] < ctime - 60:
            history.pop()
        if len(history) < 3:
            history.insert(0,ctime)
            return True
    #返回true说明可以正常访问
    #返回false说明访问频率过高

    def wait(self):
        ctime = time.time()
        wait_time = 60 - (ctime - self.history[-1])
        #此处返回的值,就会再频率过高的时候提示还剩多少秒
        return wait_time

然后再视图函数中配置throttle_classes=[VisitThrottle,]方法同认证一样,如果想要配置为全局,也同认证一样,在settins里配置

 

版本

版本在url中get传参,例如127.0.0.1:8001/app02/users/?version=v1,但是不常用.

 

url携带版本号,例如127.0.0.1:8001/app02/v1/users/

采用内置的版本类,URLPathVersioning,可以解决该问题

class UserView(APIView):
    authentication_classes=[]
    permission_classes=[]
    throttle_classes=[]
    # versioning_class = URLPathVersioning     #使用内置的版本控制类,此处可以写在全局配置文件中
    def get(self,request,*args,**kwargs):
        res = {'code':200, 'data':None}
        url = request.versioning_scheme.reverse(viewname='xxx',request=request)     #反向生成url,不过需要配套urls路由别名使用
        print(url)
        print(request.version)              #在添加后,直接在request中带有version
        return JsonResponse(res)

还需要在urls配置相应的正则

urlpatterns = [
    re_path('^(?P<version>[v1|v2]+)/users/$', views.UserView.as_view(),name='xxx'),
]

settings里全局的版本配置

    'default_version': 'v1',                    #表示默认的版本
    'allowed_versions': ['v1','v2'],            #表示允许的版本
    'version_param': 'version',                 #表示传入的关键字-key
    'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning',       #全局配置版本

 

 

 

解析器(parse)

当请求过来时,解释器会根据content-type字段,选择相应的解释器,然后并将数据封装的request.data中。一般我们都是直接采用rest里面内置的解析器,无需自己定义

class ParseView(APIView):
#接口地址 127.0.0.1:8002/app02/v1/parse/            #使用内置的解释器
    authentication_classes=[]
    permission_classes=[]
    throttle_classes=[]
    parser_classes = [JSONParser,FormParser]
#此处可以写进全局变量中。当请求过来时,解释器会根据content-type字段,选择相应的解释器,然后并将数据封装的request.data中
    def post(self,request,*args,**kwargs):
        print(request.data)             #根据解析器,将数据封装到这
        res = {'code': 200, 'data': None}
        return JsonResponse(res)

 

 

序列化

序列化:由于我们在数据库中获取的数据是queryset类型,无法向前端返回json,这一部分需要自己转换,rest的序列化可以提供这个关系转化

class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserGroupModel
        fields = '__all__'
        # fields = ['id','username','password']
        depth = 2       #该配置表示,如果字段是外键,那么是可以点出来的,这个数字就代表可以点出几层
class Group(APIView):
    #api;http://127.0.0.1:8002/app02/v1/group/3
    authentication_classes=[]
    permission_classes=[]
    throttle_classes=[]
    def get(self,request,*args,**kwargs):
        pk = kwargs.get('pk')
        groupinfo = UserGroupModel.objects.filter(id=pk).first()
        ser = GroupSerializer(instance=groupinfo,many=False)
        ret = json.dumps(ser.data,ensure_ascii=False)
        return HttpResponse(ret)

 

 

分页

一般使用内置三种分页

看第m页,每页n条数据

在第m个数据的位置上,向后看n条数据

加密分页,只看上一页和下一页:为了防止用户将页码手动修改,比如直接将页码修改9999,这样会造成数据库查询压力大,所以rest提供将页码进行加密处理。如果数据量大,这种效率高

 https://www.cnblogs.com/yume-zbh/p/16406434.html

 

路由

router自动给生成路由

from rest_framework import routers
router = routers.DefaultRouter
router.register(r'xxx',views.UserView)
url(r'(?P<version>[v1|v2]+)/users/',include(router.urls)),

 

 

 

视图**

GenricAPIView

由于GenericViewSet中ViewSetMixin重写了as_view方法,所以需要在urls里面传参

    re_path('^(?P<version>[v1|v2]+)/users/$', views.UserView.as_view({'get':'list','post':'create'})),

其中get请求会转换为list,所以在视图类中,需要填list方法

 

渲染器

将返回的数据在页面进行渲染,在页面进行美化

    renderer_classes = [JSONRenderer,BrowsableAPIRenderer]  #将返回的数据在页面进行渲染

 

标签:return,--,self,request,v1,classes,组件,DRF,history
From: https://www.cnblogs.com/powfu/p/16931071.html

相关文章

  • Web应用
    一Web应用程序是什么Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件应用程序有两种......
  • python之OS模块
    1、简介OS模块是python中整理文件和目录最为常用的模块,该模块提供了非常丰富的方法用来处理文件和目录。  知识串讲:1)模块的安装和导入importos2)os.getcwd......
  • Http协议
    一http协议简介HTTP协议是HyperTextTransferProtocol(超文本传输协议)的缩写,是用于万维网(WWW:WorldWideWeb)服务器与本地浏览器之间传输超文本的传送协议。HTTP是......
  • Codeforces div2 #836
    B核心思路:这题我们会发现其实n为奇数的时候是非常好处理的。主要是n为偶数。我们不能难发现,奇数其实就是偶数的扩展情况,这里其实主要有点比较难看出123这个的关系,但是我......
  • 第二周
    完成一个shell脚本,脚本的作用。1.运行脚本可以显示出本机的ip地址2.如果ip地址中有3这个数字,那么就打印出当前的系统时间3.如果ip地址中不含3这个数字,就批量建立用户mag......
  • 对象 方法
    importjava.util.Scanner;publicclassEext{publicstaticvoidmain(String[]args){personp=newperson();p.speak();//调用speak......
  • 主流单点登录SSO协议概述
    知识点:认证和授权单点登录,以及其主流方案1,认证与授权以小区门卫大叔的灵魂3问为例:你是谁你来自哪里你将要到哪里去认证(authentication),确认用户的身份,解决你是......
  • 《基于Python与OpenCV的人脸识别系统设计与实现》论文笔记二
    一、基本信息标题:基于Python与OpenCV的人脸识别系统设计与实现时间:2022来源:电脑知识与技术关键词:Python;OpenCV;人脸检测;人脸识别;二、研究内容问题定义:利用OpenCV......
  • uniCloud云开发入门以及对传统开发方式的思考
    事情缘由作为选修了移动互联网应用的一员,老师讲的什么JS基础,还有ES6和uniapp,当然是没怎么听,因为是之前大二的时候都大概看过。但是快到期末,老师讲了云开发,并且布置了与此......
  • 实施部署(锐捷业务软件篇2)
    大家好,我是小杜。又是独自努力的一天,周末学习更加有劲。学习人,学习魂,打工人都是人上人,到时候让所有人都会大吃一惊!上次学习完业软认证计费产品如何实施部署,那今天来就学......