函数和方法回顾、cbv源码分析、APIView执行流程分析、序列化组件介绍、序列化组件快速使用之序列化、常用字段类和参数、序列化组件之校验、字典推导式回顾

news2024/7/4 6:15:27

一 函数和方法回顾

函数和方法
	-函数:使用def关键字定义的函数,有几个参数,就要传几个参数,不能多,不能少-----》按位置传,按关键字传
    -方法:定义在类内部,可以自动传值的函数称之为方法---》绑定给对象的方法(对象方法)---》绑定给类的方法(类 方法)
    
    -对象方法:对象来调用,自动把对象传入,
    	-类也可以调用,但是类来调用,就变成了普通函数,有几个值,就要传几个值
        
    -类方法:类来调用,自动把类传入
    	-对象也可以调用,内部会取到对象的类,自动传入,它也是方法

    -函数和方法区别:能否自动传值


########使用案例############3
# 函数:使用def关键字定义的函数
# 函数:有几个参数,就要传几个参数,不能多,也不能少---------->按位置传和按关键字传
def add():
    pass


# 方法:定义在类内部,可以自动传值的函数称之为方法
# 绑定给对象的方法(对象方法)------------>绑定给类的方法(类  方法)
class Person:
    def printName(self):
        print(self.name)

    # 绑定给类的方法-----》类来调用-------》自动把类传入
    @classmethod
    def test(cls):
        print(cls.__name__)

# 注意:这个时候不能直接在实例化类的时候传入参数值
# 由于Person类中没有 __init__() 方法,并且Person的父类Object类中也没有 __init__()方法
# p = Person(name='lin')


p = Person()
# 若是给实例化的对象中放入属性,用对象调用方法就可以了
p.name = 'lin'
p.printName()

# 类是否可以调用方法?
# 可以------->怎么调用呢?
# 类名.方法
# 若是用类来调用就变成了普通函数,所以有几个值就得传几个值
Person.printName(p)

# 绑定给类的方法,会自动把类传入
Person.test()

# 对象也可以调用类的方法----》直接调用,内部会把对象的类拿到,然后自动传入
p.test()


二 cbv源码分析

# 基于类的视图---》使用类编写---》在类中写跟请求方式同名的方法---》路由配置 类名.as_view()
# 请求过来,什么请求,就会执行跟请求方式同名的方法


# 执行流程
	-请求来了---》做路由匹配---》如果是books/匹配上了 path('books/', BookView.as_view())---》内部就会执行  第二个参数(),把实参request传入--->BookView.as_view()(request)--->
    
    -研究:BookView.as_view()(request)  如何执行的
    	-BookView 中没有as_view,说明在父类中有as_view---》BookView的父类是View
        
        
        
# View.as_view的源码
@classonlymethod
def as_view(cls, **initkwargs):
    # 闭包函数
    def view(request, *args, **kwargs):
        self = cls(**initkwargs) # 类实例化得到对象:BookView的对象
        # 调用对象的绑定方法 dispatch---》去BookView中找dispatch--》找不到去父类---》View中的dispatch
        return self.dispatch(request, *args, **kwargs) # 对象的方法
    return view
    
# 执行:BookView.as_view()(request)---》本质是执行 View中as_view内部的view方法,
# 传入了reuqest----》在执行View的dispatch方法,传入了request

# 看 :View.dispatch---》源码
    def dispatch(self, request, *args, **kwargs):
        if request.method.lower() in self.http_method_names: # 判断请求方式是否在那个固定的列表中[get, post...]--->
            # 反射:通过字符串 动态的  操作对象的属性或方法
            # 假设是get请求---》去BookView中取出 get方法赋值给handler
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        # 执行handler加括号,传入了request
        # 本质是执行 get(request)
        return handler(request, *args, **kwargs)
    
    
#### 总结:
	请求来了---》执行 BookView.as_view()(request)---》内部执行了---》View的
	as_view的内部的view闭包函数---》闭包函数调用了 self.dispatch---->是BookView的,
	于是去了View的----》通过反射获取跟请求方式同名的方法---》然后执行,把request传入

在这里插入图片描述

三 APIView执行流程分析

1 基于drf的APIView写接口

#1  使用drf,以后都写cbv---》继承一个视图类---》以后都继承drf提供 的APIView

#2  APIView 继承了djagno的View

#3  补充:这三个都是一个
from django.views import View
from django.views.generic import View
from django.views.generic.base import View



# 4 继承APIView写cbv---》执行起来跟之前效果一样---》内部发生了非常大的变化
	1 写视图类
    from rest_framework.views import APIView
    class PublishView(APIView):
        def get(self, request):
            return JsonResponse({'code': 999})
    2 配置路由
    path('publish/', PublishView.as_view()),
    

2 APIView的执行流程分析

# 比之前继承django的View多了如下
	-0 去除了csrf认证
	-1 包装了新的request
    -2 执行了认证,频率,权限 这三大认证
    -3 全局异常处理:在视图类的方法中执行报错,会被异常捕获,做统一处理
    
    
# 执行流程分析
	-请求来了---》执行PublishView.as_view()(request)--->PublishView类没有as_view---》找父类---》APIView的as_view
    -APIView的as_view---》本质在禁用csrf认证
    @classmethod
    def as_view(cls, **initkwargs):
        # 调用父类的as_view得到返回值赋值给view---》django的View的as_view【看过】---》返回View的as_view的闭包函数 view
        view = super().as_view(**initkwargs)  # 现在这个view就是原来看的View的as_view的view
        # 去除了csrf认证----》局部禁用csrf---》在视图函数上加 装饰器csrf_exempt
        # 加了装饰器的本质:    被装饰的函数=装饰器(被装饰的函数)
        return csrf_exempt(view)
    
    
    -PublishView.as_view()(request)--》执行了禁用掉csrf的View的as_view的view---》self.dispath--->APIView的dispath
     def dispatch(self, request, *args, **kwargs):
        # 1 包装了新的request对象
        request = self.initialize_request(request, *args, **kwargs)
        # 把新的request,赋值给了 self.request
        # self 是 PublishView的对象 
        self.request = request
        try:
            # 2 执行了3大认证
            self.initial(request, *args, **kwargs)
            
            ######开始### 跟之前View的dispatch是一样的---》根据请求方式执行类中同名方法
            ###执行视图类的方法
            if request.method.lower() in self.http_method_names:
                handler = getattr(self, request.method.lower(),
                                  self.http_method_not_allowed)
            else:
                handler = self.http_method_not_allowed

            response = handler(request, *args, **kwargs)
            ######结束###
            
            
		# 执行三大认证和视图类的方法,如果出了异常,抛了错,会被捕获,统一处理
        except Exception as exc:
            response = self.handle_exception(exc)

        self.response = self.finalize_response(request, response, *args, **kwargs)
        return self.response
    
    
    
# 装饰器的本质

@auth  # add=auth(add)-->以后调用add 实际上调用   auth(add)()
def add():
    pass

add=auth(add)

### 包装新的request
	# 1 request.data:前端传入的数据(post,put,编码格式)--->写到在请求体中的数据,都用
    # 2 老request中有 request.GET 新的使用request.query_params 充当
    # 3 其他的所有属性方法,用起来跟之前一样
    
    
### 三大认证
	    self.perform_authentication(request)
        self.check_permissions(request)
        self.check_throttles(request)
        
        
### 处理了全局异常,统一处理了


#### 总结:
	视图类继承APIView后多了
    	-0 去除了csrf认证
    	-1 新的request
        	-request.data
            -request.query_params
            -request.其他跟之前一样
            -request._request  是老的
        -2 三大认证
        -3 全局异常

四 序列化组件介绍

# 基于原生djagno写接口---》序列化---》自己用for循环做-->比较麻烦

# 借助于drf提供的序列化组件来完成快速序列化


## 使用步骤
	1 先在配置文件中注册 :
        INSTALLED_APPS = [
        'rest_framework',
        ]
        
    2 写一个序列化类--》新建一个py文件---》serializer.py
    	-继承drf提供的serializers.Serializer
        -在类中写要序列化的字段:字段类---》跟之前学过的models.py中的字段类完全对应,
         但是比models多
        
        
    3 在视图类中,使用序列化类
    	多条:serializer=UserSerializer(instance=users,many=True)
        单条:serializer=UserSerializer(instance=user)
        
    4 拿到序列化后的数据
    	serializer.data  可能是列表,可能是字典
    
    5 使用drf提供的Resposne 返回
    	from rest_framework.response import Response

五 序列化组件快速使用之序列化

1 路由

urlpatterns = [
    path('users/', UserView.as_view()),
    path('users/<int:pk>', UserDetailView.as_view()),
]

2 视图类

from .models import User
from .serializer import UserSerializer
from rest_framework.response import Response
class UserView(APIView):
    def get(self,request):
        users=User.objects.all()
        # 之前用for循环,现在用序列化类
        # 传了两个参数:instance 要序列化的对象(qs,单个对象)   many=True表示序列化多条,如果不写就是序列化一条
        ser=UserSerializer(instance=users,many=True)
        # 拿到序列化后的数据  ser.data--->多条就是列表  单条字典
        return Response(ser.data)

class UserDetailView(APIView):
    def get(self,request,pk):
        user=User.objects.all().filter(pk=pk).first()
        # 传了两个参数:instance 要序列化的对象   many=True表示序列化多条
        ser=UserSerializer(instance=user)
        return Response(ser.data)

3 序列化类

# 写序列化类
from rest_framework import serializers

class UserSerializer(serializers.Serializer):
    # 写要序列化的字段
    name = serializers.CharField()
    # hobby = serializers.CharField()
    # password=serializers.CharField()
    age=serializers.IntegerField()

六 常用字段类和参数

1 常用字段类

# 写序列化类的时候,写了CharField,IntegerField  跟django中models中的类似

# 序列化类中的和models中的一一对应,但是序列化类中多一些

# 多的--->暂时有个印象,后面会详细讲
ListField
DictField

# 使用场景
	{name:金鹏没,price:99,publish:{name:xx出版社,addr:南京},authors:[{},{}]}
BooleanFieldBooleanField()
NullBooleanFieldNullBooleanField()
CharFieldCharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True)
EmailFieldEmailField(max_length=None, min_length=None, allow_blank=False)
RegexFieldRegexField(regex, max_length=None, min_length=None, allow_blank=False)
SlugFieldSlugField(maxlength=50, min_length=None, allow_blank=False) 正则字段,验证正则模式 [a-zA-Z0-9-]+
URLFieldURLField(max_length=200, min_length=None, allow_blank=False)
UUIDFieldUUIDField(format=’hex_verbose’) format: 1) 'hex_verbose'"5ce0e9a5-5ffa-654b-cee0-1238041fb31a" 2) 'hex'"5ce0e9a55ffa654bcee01238041fb31a" 3)'int' - 如: "123456789012312313134124512351145145114" 4)'urn' 如: "urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a"
IPAddressFieldIPAddressField(protocol=’both’, unpack_ipv4=False, **options)
IntegerFieldIntegerField(max_value=None, min_value=None)
FloatFieldFloatField(max_value=None, min_value=None)
DecimalFieldDecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None) max_digits: 最多位数 decimal_palces: 小数点位置
DateTimeFieldDateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None)
DateFieldDateField(format=api_settings.DATE_FORMAT, input_formats=None)
TimeFieldTimeField(format=api_settings.TIME_FORMAT, input_formats=None)
DurationFieldDurationField()
ChoiceFieldChoiceField(choices) choices与Django的用法相同
MultipleChoiceFieldMultipleChoiceField(choices)
FileFieldFileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
ImageFieldImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
ListFieldListField(child=, min_length=None, max_length=None)
DictFieldDictField(child=)

2 常用字段参数

# 字段类上,可以传参数,是做反序列化校验用的
	CharField:max_length,min_lenght,allow_blank: 可以不传
    IntegerField:max_value,min_value
    
 # 所有字段都可以用通用的
	-非常重要:read_only,write_only
    -default,required,allow_null
max_length最大长度
min_lenght最小长度
allow_blank是否允许为空
trim_whitespace是否截断空白字符
max_value最小值
min_value最大值
参数名称说明
read_only表明该字段仅用于序列化输出,默认False
write_only表明该字段仅用于反序列化输入,默认False
required表明该字段在反序列化时必须输入,默认True
default反序列化时使用的默认值
allow_null表明该字段是否允许传入None,默认False
validators该字段使用的验证器
error_messages包含错误编号与错误信息的字典
label用于HTML展示API页面时,显示的字段名称
help_text用于HTML展示API页面时,显示的字段帮助提示信息

七 序列化组件之校验

# 序列化组件
	- 序列化
    - 反序列化(没学)
    - 反序列化校验(学了)
    
    
# 反序列化之校验:    ser.is_valid()
	1 字段自己的校验规则(字段类的属性上) 
    2 局部钩子(给某个字段加校验规则)  
    3 全局钩子
    
    
# 反序列化保存
	ser.save()---》必须序列化类中重写 create--》自己定保存到哪个表
    def create(self, validated_data):  # validated_data:前端传入,校验过后的数据
        user = User.objects.create(**validated_data)
        return user

案例展示

视图类

from .models import User
from .serializer import UserSerializer
from rest_framework.response import Response


class UserView(APIView):
    def get(self, request):
        users = User.objects.all()
        # 之前用for循环,现在用序列化类
        # 传了两个参数:instance 要序列化的对象(qs,单个对象)   many=True表示序列化多条,如果不写就是序列化一条
        ser = UserSerializer(instance=users, many=True)
        # 拿到序列化后的数据  ser.data--->多条就是列表  单条字典
        return Response(ser.data)

    def post(self, request):
        # 前端提交过来的数据 request.data
        ser = UserSerializer(data=request.data)
        # 校验数据--》3层: 1 字段自己的校验规则(字段类的属性上)  2 局部钩子(给某个字段加校验规则)  3 全局钩子
        if ser.is_valid():
            # 保存
            ser.save()  # 会报错,序列化类中重写create方法

            return Response({'code': 100, 'msg': '保存成功'})
        else:  # ser.errors 校验失败错误的数据
            return Response({'code': 101, 'msg': ser.errors})


class UserDetailView(APIView):
    def get(self, request, pk):
        user = User.objects.all().filter(pk=pk).first()
        # 传了两个参数:instance 要序列化的对象   many=True表示序列化多条
        ser = UserSerializer(instance=user)
        return Response(ser.data)

序列化类

# 写序列化类
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from .models import User


class UserSerializer(serializers.Serializer):
    # 写要序列化的字段
    # 字段自己
    name = serializers.CharField(max_length=8, min_length=3, required=True)
    hobby = serializers.CharField()
    password = serializers.CharField()
    age = serializers.IntegerField()

    # 局部钩子
    # 写一个方法  validate_字段名,传入要校验的数据--》前端传入的
    def validate_name(self, value):
        if value.startswith('sb'):
            raise ValidationError('不能以sb开头')  # 如果校验失败,抛ValidationError
        return value  # 如果校验通过,返回 value,后续继续用

    # 全局钩子
    # 名字和hobby不能一致   多个字段的同时校验
    def validate(self, attrs):  # 前端传入的所有数据,校验过后attrs 字典
        name = attrs.get('name')
        hobby = attrs.get('hobby')
        if name == hobby:
            raise ValidationError('名字和爱好不能一样')
        else:
            return attrs

    # 重写create方法
    def create(self, validated_data):  # validated_data:前端传入,校验过后的数据
        user = User.objects.create(**validated_data)
        return user

路由

urlpatterns = [
    path('users/', UserView.as_view()),
    path('users/<int:pk>', UserDetailView.as_view()),
]

八 字典推导式回顾

'''
username=lin&password=123 这种格式转成字典
	-两层for循环
	-字典推导式
'''

res = 'username=lin&password=123'

# 定义一个空字典用于接收键值
res_dict = {}

# 将字符串分割成键值对并添加到字典中
for item in res.split('&'):
    print(item)  # username=lqz  password=123
    key, value = item.split('=')
    res_dict[key] = value

print(res_dict)


# 使用字典推导式将字符串分割成键值对并创建字典
res_dict = {key: value for key, value in (item.split('=') for item in res.split('&'))}

print(res_dict)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/948953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RTPEngine 通过 HTTP 获取指标的方式

文章目录 1.背景介绍2.RTPEngine 支持的 HTTP 请求3.通过 HTTP 请求获取指标的方法3.1 脚本配置3.2 请求方式 1.背景介绍 RTPEngine 是常用的媒体代理服务器&#xff0c;通常被集成到 SIP 代理注册服务器中实现媒体传输的功能以减小 SIP 代理服务器的压力&#xff0c;其架构如…

ChatGPT 一条命令总结Mysql所有知识点

想学习Mysql的同学,可以使用ChatGPT直接总结mysql所有的内容与知识点大纲 输入 总结Mysql数据库所有内容大纲与大纲细分内容 ChatGPT不光生成内容,并且直接完成了思维导图。 AIGC ChatGPT ,BI商业智能, 可视化Tableau, PowerBI, FineReport, 数据库Mysql Oracle, Offi…

业务需要咨询?开发遇到 bug 想反馈?开发者在线提单功能上线!

大家是否遇到过下列问题—— 在开发的时候&#xff0c;遇到 bug 需要反馈… 有合作意向的时候&#xff0c;想更多了解业务和相关产品… 在接入的时候&#xff0c;需要得到专业技术支持… 别急&#xff0c;荣耀开发者服务平台在线提单功能上线了~ 处理问题分类说明&#xff1…

mov怎样转成mp4?简单的格式转换方法分享

将mov文件转换为MP4格式的好处是多方面的。首先&#xff0c;MP4格式相对于mov格式拥有更好的压缩效率&#xff0c;可以减小文件大小&#xff0c;从而节省存储空间和传输时间。其次&#xff0c;MP4格式是一种广泛使用的视频格式&#xff0c;几乎所有的设备和平台都支持MP4格式&a…

【跟小嘉学 Rust 编程】二十、进阶扩展

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…

没有永远的王者…Zig替代C,将成定局!

新语言的出现&#xff0c;真的能威胁到老牌语言吗&#xff1f;或许&#xff0c;真的没有永远的王者。就像最近春风得意的Mojo&#xff0c;LLVM之父Chris Lattner称其不会威胁到 Python&#xff0c;但会让C等语言感到恐惧。 新语言层出不穷之时&#xff0c;旧语言的中年危机就会…

TSN协议解读系列 | (1) 帧抢占:br老先生的旅途

帧抢占协议还是怀念以前那个车马很慢&#xff0c;书信很远&#xff0c;带宽顶天也就几十兆的年代。 ▎旧时代的辉煌 1983年秋&#xff0c;IEEE 802.3大学正式成立&#xff0c;这所大学遵循的是严格的标准化管理&#xff0c;数据包们的衣食住行都需要符合学校的规定&#xff0…

SpringBoot + layui 框架实现一周免登陆功能

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

便携式明渠流量计工作原理

便携式明渠流量计工作原理是什么&#xff1f; 简单来说便携式明渠流量计是一种用于测量明渠水流量的仪器。它的工作原理基于流速-水位关系&#xff0c;通过测量水流速度和水位差来计算明渠的流量。 具体原理如下&#xff1a; 1.测量水流速度&#xff1a;通常使用悬挂在水中的水…

Kubernetes快速进阶与实战:构建可靠的容器化应用平台

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 1. 什么是Kubernetes&am…

企业面临的IP风险,如何应对?

IP风险画像为企业或组织在知识产权领域面临的潜在风险和威胁的综合概览。通过对相关知识产权的保护和管理&#xff0c;企业可以预测和应对潜在的法律、商业和声誉风险。 IP数据云帮助企业更好地了解和应对知识产权方面的风险。并提供了关于当前全球知识产权环境的重要信息&…

Yolov8原理详细解析!一文看懂

引言 Yolo(You Only Look Once)是一种one-stage目标检测算法&#xff0c;即仅需要 “看” 一次就可以识别出图片中物体的class类别和边界框。Yolov8是Ultralytics公司最新推出的Yolo系列目标检测算法&#xff0c;可以用于图像分类、物体检测和实例分割等任务。 根据官方描述&…

linux添加sht3x温湿度传感器驱动记录

最近拿到一块imx6ull板子&#xff0c;上面有一颗温湿度传感器sht30,需要读取其数值。本人能力有限&#xff0c;自己写驱动还有一点困难&#xff0c;好在 linux内核里自带了很多器件的驱动&#xff0c;只需要找到相关的驱动文件根据要求修改一下设备树、添加进内核里编译就可以。…

【ES】Elasticsearch 常见的简单查询

查看es中有哪些索引 请求方式&#xff1a;GET 请求地址&#xff1a;http://localhost:9200 /_cat/indices?v 参数&#xff1a;无 结果&#xff1a; 查看索引全部数据 请求方式&#xff1a;GET 请求地址&#xff1a;http://localhost:9200/index-2023-08/_search 参数&a…

VUE之jspreadsheet电子excel表格实时动态高度设置

问题&#xff1a;excel电子表格在不同屏幕大小下横向滚动条会被遮挡 排查原因&#xff1a;由于excel高度固定导致 解决方法&#xff1a;设计页面较多&#xff0c;所以封装公共方法 步骤&#xff1a; 1.使用混入封装动态设置excel高度方法&#xff1a; const mixinJexcel …

MySQL行格式 又称 记录格式

行格式 ROW_formate compact 行格式dynamic 行格式 默认compress 行格式 行格式定义 创建表同时指定行格式 create table 表明 ( 列的信息) row_formate行格式名称 修改行格式 alter table 表明 ROW_FORMATE 行格式名称 查看mysql8.0 默认行格式 select innodb_default_row_…

HTTP状态码504(Gateway Timeout)报错原因分析和解决办法

文章目录 504报错原因分析一、用户角度1. 代理服务器问题2. 网络问题 二、网站管理员角度1. 服务器负载过重2. 网关配置问题3. 目标服务器响应慢4. IIS/nginx/apache服务关闭5. 维护或故障6. 数据库的慢处理也会导致504 用户角度可以采取哪些措施解决504错误1. 刷新页面2. 检查…

Viobot定位用于导航

注&#xff1a;此教程以轮式机器人作为一个样例&#xff0c;具体的应用还需要用户自己去做更深入的开发。当然&#xff0c;着并不是唯一的方法&#xff0c;有更好的方法也欢迎大家讲一下自己的思路&#xff0c;有什么说错的地方也欢迎大家批评指正。 路径规划部分我们选用轮式机…

什么是量化交易接口?(股票下单接口)特点(一)

股市领域里的量化交易接口是一种用于与金融市场进行交互的编程接口&#xff0c;它允许开发者通过计算机程序自动执行交易策略。量化交易接口通常提供以下功能&#xff1a; 1. 实时市场数据获取&#xff1a;量化交易接口通常可以提供实时的市场行情数据&#xff0c;包括股票、期…

el-upload 上传附件

案例: <template><div><el-drawertitle"附件信息"v-model"drawer"direction"rtl":before-close"handleClose"size"35%":close-on-click-modal"false":close-on-press-escape"false">…