当前位置: 首页 > news >正文

importlib的使用、9个视图子类、视图集、drf之路由、drf之请求响应回顾、GenericViewSet相关流程图

一 drf之请求响应回顾

# 1 drf请求-请求对象:data,query_params,其他跟之前一样,FILES-默认:支持三种编码-局部配置:视图类中-from rest_framework.parsers import JSONParser, FormParser, MultiPartParser-parser_classes = [JSONParser]-全局配置:REST_FRAMEWORK = {'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser','rest_framework.parsers.FormParser','rest_framework.parsers.MultiPartParser'],}-全局使用了,局部再换---》视图类改即可# 2 drf响应-Response  ---》一定继承了django原生的HTTPResponse-data:字典,列表,字符串,空赋值给它---》http响应体中-status:http响应状态码  from rest_framework import status-headers:响应头res=HttpResponse()  res=render()   res=redirect()  res=JsonResponse()四件套之一res['name']='lin'  # 放到响应头中return res-响应编码格式---》一般不动 # 3 两个视图基类-APIView---》写了5个接口-GenericAPIView 继承自APIView---》以后跟数据库打交道和要序列化就用它### 重要属性### -queryset:以后放所有某个表查询出的数据-serializer_class:要序列化的类### 重要方法###-get_queryset  :要序列化的所有数据,qs对象-get_serializer :序列化类-get_object  :修改,查询,删除 的单条# 4 5个视图扩展类RetrieveModelMixin, CreateModelMixin, DestroyModelMixin, ListModelMixin, UpdateModelMixin

二 9个视图子类

from rest_framework.generics import ListAPIView, CreateAPIView, ListCreateAPIView
from rest_framework.generics import RetrieveAPIView, DestroyAPIView, UpdateAPIView
from rest_framework.generics import RetrieveUpdateDestroyAPIView, RetrieveDestroyAPIView, RetrieveUpdateAPIView# 以后想写5个接口中的某一个或某几个或所有,只需要选择继承不同的类即可,类中只需要配置两个类属性queryset = Publish.objects.all()serializer_class = PublishSerializer

1 视图类

#1 想写  publish: 查询所有,查询单条,修改一条,新增一条,删除一条的接口
class PublishView(ListCreateAPIView):queryset = Publish.objects.all()serializer_class = PublishSerializerclass PublishDetailView(RetrieveUpdateDestroyAPIView):queryset = Publish.objects.all()serializer_class = PublishSerializer#2 想写  publish: 查询单条,新增一条,的接口--->使用9个视图子类编写
class PublishView(CreateAPIView):queryset = Publish.objects.all()serializer_class = PublishSerializerclass PublishDetailView(RetrieveAPIView):queryset = Publish.objects.all()serializer_class = PublishSerializer#3 想写  publish: 查询单条,新增一条,的接口--->使用5个视图扩展类+GenericAPIView
class PublishView(GenericAPIView,CreateModelMixin):queryset = Publish.objects.all()serializer_class = PublishSerializerdef post(self,request,*args,**kwargs):return self.create(request,*args,**kwargs)
class PublishDetailView(GenericAPIView,RetrieveModelMixin):queryset = Publish.objects.all()serializer_class = PublishSerializerdef get(self,request,*args,**kwargs):return self.retrieve(request,*args,**kwargs)

2 路由

path('publish/', PublishView.as_view()),
path('publish/<int:pk>', PublishView.as_view()),

三 视图集

1 ModelViewSet

# 1 只要视图类继承了它,路由写法改一下,5个接口都有了
from rest_framework.viewsets import ModelViewSet
class PublishView(ModelViewSet):queryset = Publish.objects.all()serializer_class = PublishSerializerpath('publish/', PublishView.as_view({'get':'list','post':'create'})),
path('publish/<int:pk>', PublishView.as_view({'get':'retrieve','put':'update','delete':'destroy'})),

1.1 ModelViewSet源码分析

# 有查询所有接口-get--list----》拿到所有数据,序列化--返回# 新增一条-post---create---》之前咱们写的新增的代码一样的# 为什么get 就变成了list
# 为什么post 就变成了create

2 ViewSetMixin

# 没见过
# ViewSetMixin 决定了,以后路由写法就变了-path('publish/', PublishView.as_view({'get':'list','post':'create'}))-path('publish/', PublishView.as_view({'get':'lqz'}))# 源码分析-class GenericViewSet(ViewSetMixin, generics.GenericAPIView):ViewSetMixin必须放前面--》保证执行的as_view是ViewSetMixin的-请求来了,路由匹配成功---》执行ViewSetMixin的as_view内的view(request)def view(request, *args, **kwargs):self = cls(**initkwargs) # 类实例化得到对象--》self是谁的对象?PublishViewself.action_map = actions # {'get':'list','post':'create'}# method:get# action: listfor method, action in actions.items():# list 方法handler = getattr(self, action) #PublishView对象中反射list,拿到了# 反射设置值#setattr(PublishView视图类的对象,get,list 方法)# PublishView视图类的对象中就会有一个get方法,就是listsetattr(self, method, handler)return self.dispatch(request, *args, **kwargs)
# 总结:-路由中这样配置:PublishView.as_view({'get':'list','post':'create'})-以后get请求过来,本质执行的就是视图类中的list方法

2.1 以后视图类中方法名可以随意命名,只要路由做好映射

# 继承的类是:只要继承ViewSetMixin ,就能视图类中方法任意命名,路由写法变化

3 ReadOnlyModelViewSet

# 以后写的接口,只想有 获取单条和获取所有,继承它

4 视图层中类的总结

# 1 两个视图基类-APIView和GenericAPIView-APIView的执行流程:包装了新的  处理了csrfrequeset,执行了3大认证,处理全局异常-GenericAPIView:要做序列化,要跟数据库打交道,就直接继承它即可-queryset-serializer_class-get_object-get_queryset-get_serializer# 2 5个视图扩展类(不是视图类),需要GenericAPIView才能用-快速使用5个接口-某几个接口:查询单条,新增一条,的接口--->使用5个视图扩展类+GenericAPIViewclass PublishView(GenericAPIView,CreateModelMixin)queryset=Publish.objects.all()serializer_class=序列化类def post(self,request)return self.create(request)class PublishDetailView(GenericAPIView,RetrieveModelMixin)queryset=Publish.objects.all()serializer_class=序列化类def get(self,request)return self.retrieve(request)# 3 9个视图子类(继承GenericAPIView+5个视图扩展类的组合)ListAPIView, CreateAPIView  ListCreateAPIViewRetrieveAPIView, DestroyAPIView, UpdateAPIViewRetrieveUpdateDestroyAPIView, RetrieveDestroyAPIView, RetrieveUpdateAPIView# 4 视图集-ModelViewSet:-ViewSetMixin+GenericAPIView+5个视图扩展类-GenericViewSet+5个视图扩展类-ViewSetMixin源码:路由做映射的配置,以后视图类中方法可以随便命名-Viewset:ViewSetMixin+APIView---》不需要序列化,路由写法变了-GenericViewSet:ViewSetMixin+GenericAPIView--》需要序列化,需要用数据库,路由写法变化-ReadOnlyModelViewSet:list和retrieve

四 drf之路由

# 之前路由写法:path('books/', BookView.as_view())# 以后一旦继承了ViewSetMixin,就变成了path('publish/', PublishView.as_view({'get': 'list', 'post': 'create'}))# 这样写起来,做映射,可能有些麻烦,于是drf,帮咱们封装了两个路由类---》可以帮助咱们快速生成之前咱们写的映射关系###### 必须是继承ViewSetMixin+APIView及其子类才能自动生成  SimpleRouter  DefaultRouter## 自动生成路由:自动映射如下:
{'get': 'list', 'post': 'create'}
{'get': 'retrieve', 'put': 'update', 'delete': 'destroy'}## 其他的-->视图类中有别的方法,我们想做映射,需要使用装饰器

使用方式

# 大前提:必须是继承ViewSetMixin+APIView及其子类才能自动生成
####使用步骤
# urls.py中
#### 1 导入路由类
from rest_framework.routers import SimpleRouter, DefaultRouter
#### 2 类实例化得到对象
router = SimpleRouter()
#### 3 自动生成路由,调用对象的某个方法,完成跟视图类的对应关系,映射路由
router.register('publish', PublishView, 'publish')
# router.register('books', BookView, 'books') #  后期可以注册更多
router.register('user',UserView,'user')
##### 4 把自动生成的路由,加到总路由中
urlpatterns = urlpatterns + router.urls  # 两个列表直接相加### 第四步可以这样写path('api/v1/', include(router.urls)),   # http://127.0.0.1:8008/api/v1/user/register/--->post

1 SimpleRouter, DefaultRouter

SimpleRouter, DefaultRouter区别-DefaultRouter生成的路径多一个根路径 api-root-DefaultRouter会多附带一个默认的API根视图,返回一个包含所有列表视图的超链接响应数据
以后就用:SimpleRouter就可以

2 action装饰器

# 作用:为视图类中的方法做路径的映射-这些方法需要排除5个 :create,list,destroy,update,retrieve# 使用方式@action(methods=['POST'],detail=False)def register(self, request):return Response('register')
# 自动生成:http://127.0.0.1:8008/user/register/---->post--->就会执行register
# action参数-methods请求方式,可以写多个-detail:路径中是否带id号  http://127.0.0.1:8008/user/register/    # detail=Falsehttp://127.0.0.1:8008/user/4/register/  # detail=True*********************** 代码展示 ***********************************
-1.路由
from django.contrib import admin
from django.urls import path
from app01.views import UserView# 1.导入路由类
from rest_framework.routers import SimpleRouter, DefaultRouter
# 2.类实例化得到对象
router = SimpleRouter()
# 3.自动生成路由,调用对象的某个方法,完成跟视图类的对应关系,映射路由
router.register('user', UserView, 'user')urlpatterns = [path('admin/', admin.site.urls),# 访问 login/路径  post请求就会执行UserView中的register方法path('register/', UserView.as_view({'post': 'register'})),]urlpatterns += router.urls-2.视图函数
from rest_framework.decorators import actionclass UserView(GenericViewSet):# http://127.0.0.1:8000/user/register/ ----> post -----> 就是执行 register# url_path 是路径后面的名字, 如果不写,就以方法名为路径# @action(methods=['POST'], detail=False, url_path='reg')# methods 请求方式# detail 是否带id# @action(methods=['POST'], detail=False)@action(methods=['POST'], detail=True)# def register(self, request):# http://127.0.0.1:8000/user/2/register/def register(self, request, pk):print(pk)# self.get_queryset()return Response('register')

3 以后继承ModelViewSet也可也能会重写好多方法

#### 重写list
class PublishView(ModelViewSet):queryset = Publish.objects.all()serializer_class = PublishSerializerdef list(self, request, *args, **kwargs):  # 以后可能会重写list,做自己的定制res=super().list(request, *args, **kwargs)return Response({'code':100,'msg':'成功','result':res.data})### 重写get_serializer_class
def get_serializer_class(self):  # 是GenericAPIView类中的方法,返回什么,以后就以哪个序列化类继续操作print(self.action)if self.request.method=='POST':return WritePublishSerializerelse:return self.serializer_class### 重写perform_create
def perform_create(self, serializer):serializer.save()### 序列化使用PublishSerializer,反序列化使用 WritePublishSerializer   

4 视图类的对象中的action参数

print(self.action)  
# 视图类的对象中有个action属性---》它是当次请求执行的方法名的字符串# 通过action可以限制视图类中某个方法使用的序列化类是哪个

importlib的使用

`importlib` 是 Python 标准库中的一个模块,它提供了一种动态导入模块和获取模块信息的方式,
允许你在运行时加载、导入和使用 Python 模块。这对于编写可扩展、灵活的代码和插件系统非常有用。以下是一些 `importlib` 模块的常见用法示例:1. **动态导入模块**import importlib# 动态导入模块module_name = "my_module"my_module = importlib.import_module(module_name)# 使用动态导入的模块result = my_module.my_function()2. **从模块中导入对象**import importlib# 动态导入模块module_name = "my_module"my_module = importlib.import_module(module_name)# 从模块中导入对象my_function = getattr(my_module, "my_function")# 使用导入的对象result = my_function()3. **重新加载模块**import importlib# 动态导入模块module_name = "my_module"my_module = importlib.import_module(module_name)# 重新加载模块my_module = importlib.reload(my_module)4. **获取模块的文件路径**import importlib# 动态导入模块module_name = "my_module"my_module = importlib.import_module(module_name)# 获取模块的文件路径module_path = my_module.__file__这些示例演示了如何使用 `importlib` 动态导入模块、从模块中导入对象、
重新加载模块以及获取模块的文件路径。
这些功能可以用于构建插件系统、模块化应用程序和动态加载模块的需求。

五、GenericViewSet相关流程图

1.GenericViewSet继承流程图

在这里插入图片描述

2.minix和GenericViewSet流程图

在这里插入图片描述

3.minix和GenericViewSet关系详情流程图

在这里插入图片描述

六、rest_framework导图

在这里插入图片描述

相关文章:

importlib的使用、9个视图子类、视图集、drf之路由、drf之请求响应回顾、GenericViewSet相关流程图

一 drf之请求响应回顾 # 1 drf请求-请求对象&#xff1a;data&#xff0c;query_params&#xff0c;其他跟之前一样&#xff0c;FILES-默认&#xff1a;支持三种编码-局部配置&#xff1a;视图类中-from rest_framework.parsers import JSONParser, FormParser, MultiPartPars…...

国际站阿里云服务器远程桌面密码错误怎么办?苹果手机如何远程登录?

阿里云服务器是云计算领域的一种重要服务&#xff0c;它可以帮助用户在云端部署和管理自己的应用程序和网站。但是&#xff0c;有时候用户可能会遇到远程桌面密码错误的问题&#xff0c;导致无法登录到服务器。本文将介绍一些解决办法&#xff0c;以及如何使用苹果手机远程登录…...

CRMEB多端多语言系统文件上传0Day代审历程

Git仓库&#xff1a; https://github.com/crmeb/CRMEB简介&#xff1a; 两天攻防中&#xff0c;某政局子公司官网后台采用的CRMEB开源商城CMS&#xff0c;挺奇葩&#xff0c;别问怎么总让我碰到这种东西&#xff0c;我也不知道&#xff0c;主打的就是一个魔幻、抽象。最后通过…...

孙哥Spring源码第18集

第18集 refresh()-invokeBeanFactoryPostProcessor-二-ConfigurationClassPostProcessor的处理逻辑 【视频来源于&#xff1a;B站up主孙帅suns Spring源码视频】【微信号&#xff1a;suns45】 1、为什么PropertySource先处理&#xff1f; 因为Conponent A在处理的过程中 要把…...

【STM32】文件系统FATFS与Flash的初步使用

文件系统简介 简介可以不看&#xff0c;直接看移植步骤 文件系统是介于应用层和底层间的模糊层。底层提供API&#xff0c;比如说使用SDIO或者SPI等读写一个字节。文件系统把这些API组合包装起来&#xff0c;并且提供一些列函数&#xff0c;我们可以使用这些函数进行更进一步的…...

Android Glide in RecyclerView,only load visible item when page return,Kotlin

Android Glide in RecyclerView&#xff0c;only load visible item when page return&#xff0c;Kotlin base on this article&#xff1a; Android Glide preload RecyclerView切入后台不可见再切换可见只加载当前视野可见区域item图片&#xff0c;Kotlin_zhangphil的博客…...

【SCI征稿】3个月左右录用!计算机信息技术等领域均可,如机器学习、遥感技术、人工智能、物联网、人工神经网络、数据挖掘、图像处理

计算机技术类SCIE&EI 【期刊简介】IF&#xff1a;1.0-2.0&#xff0c;JCR4区&#xff0c;中科院4区 【检索情况】SCIE&EI 双检&#xff0c;正刊 【参考周期】期刊部系统内提交&#xff0c;录用周期3个月左右&#xff0c;走完期刊部流程上线 【征稿领域】计算机信息…...

Golang 中的 crypto/ecdh 包详解

什么是 ECDH 算法&#xff1f; ECDH&#xff08;Elliptic Curve Diffie-Hellman&#xff09;算法是一种基于椭圆曲线的密钥交换协议&#xff0c;用于安全地协商共享密钥&#xff08;Secret Key&#xff09;&#xff0c;步骤如下&#xff1a; 1. 选择椭圆曲线&#xff1a;ECDH…...

系统学习live555

文章目录 系统学习live555系统学习LIVE555的步骤&#xff1a;1.了解基本概念&#xff1a;2.**查看官方文档&#xff1a;**3.**下载和编译库&#xff1a;**4.**阅读示例代码&#xff1a;**5.**了解库结构&#xff1a;**6.**创建简单项目&#xff1a;**7.**阅读更多文档&#xff…...

Linux下的系统编程——进程的执行与回收(八)

前言&#xff1a; 前面我们对进程已经有了一个初步的了解与认识&#xff0c;现在让我们学习一下进程中一些函数的具体使用&#xff0c;比如exec可以执行一些指定的程序&#xff0c;wait / waitpid可以回收子进程&#xff0c;什么是孤儿进程&#xff0c;什么是僵尸进程&#xf…...

第十九章 ObjectScript - 执行例程

文章目录 第十九章 ObjectScript - 执行例程执行例程New 命令 第十九章 ObjectScript - 执行例程 执行例程 执行例程时&#xff0c;使用DO命令&#xff0c;如下所示: do ^routinename要执行一个过程、函数或子程序(不访问其返回值)&#xff0c;可以使用以下命令: do label^ro…...

Podman安装与使用

1.Podman简介 Podman是一个无守护进程的容器引擎&#xff0c;用于在Linux系统上开发、管理和运行OCI容器。 Podman的主要功能包括&#xff1a; 创建和管理容器&#xff1a;Podman可以创建、启动、停止和删除容器&#xff0c;以及管理容器的生命周期。容器镜像管理&#xff1…...

C++ 嵌套循环

一个循环内可以嵌套另一个循环。C 允许至少 256 个嵌套层次。 语法 C 中 嵌套 for 循环 语句的语法&#xff1a; for ( init; condition; increment ) {for ( init; condition; increment ){statement(s);}statement(s); // 可以放置更多的语句 }C 中 嵌套 while 循环 语句的…...

锁( ReentrantLock,Synchronized)

1.lock和synchronized 语法层面 synchronized 是关键字&#xff0c;源码在 jvm 中&#xff0c;用 c 语言实现&#xff1b; Lock 是接口&#xff0c;源码由 jdk 提供&#xff0c;用 java 语言实现&#xff1b; 使用 synchronized 时&#xff0c;退出同步代码块锁会自动释放&…...

主频计算-架构真题(二十三)

某文件系统采用多级索引结构&#xff0c;若磁块大小为4K字节&#xff0c;每个块号需占4个字节&#xff0c;那么采用二级索引结构时的文件最大长度可占用&#xff08;&#xff09;个物理块。 1、1024 2、1024*1024 3、2048*2048 4、4096*4096 答案&#xff1a;B 解析&…...

docker安装redis实操记录

1.Docker拉取镜像 docker pull redis2.Docker挂载配置文件 创建挂载文件夹 mkdir -p /home/redis/data下载默认配置文件 redis.conf 3.启动redis 容器 docker run --restartalways --log-opt max-size100m --log-opt max-file2 -p 6379:6379 --name redis -v /home/redi…...

MobaXterm 突破14个session限制

通常情况下&#xff1a;随着工作时间的增长&#xff0c;我们会保存许许多多的linux到本地的mobastream&#xff0c;然后当超过14个&#xff0c;就会被被限制&#xff0c;这个会让人很头疼。 1. 安装python&#xff0c;配置好环境变量 测试安装成功&#xff1a; 2. 基于项目进行…...

使用Redisson实现高并发抢红包

一、概述 1、简介 在传统的抢红包场景中&#xff0c;如果面临高并发请求&#xff0c;通常需要考虑加锁来保证数据的一致性。而在分布式环境下&#xff0c;为了解决分布式锁的问题&#xff0c;我们可以使用Redisson这样的分布式Java对象和服务框架来实现。 本篇博客将演示如何…...

【网络编程】TCP/IP协议(互联网的基石)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…...

【VS Code插件开发】自定义侧边栏、视图(六)

&#x1f431; 个人主页&#xff1a;不叫猫先生&#xff0c;公众号&#xff1a;前端舵手 &#x1f64b;‍♂️ 作者简介&#xff1a;前端领域优质作者、阿里云专家博主&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4e2; 资料领取&#xff1a;前端…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...