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请求-请求对象:data,query_params,其他跟之前一样,FILES-默认:支持三种编码-局部配置:视图类中-from rest_framework.parsers import JSONParser, FormParser, MultiPartPars…...
国际站阿里云服务器远程桌面密码错误怎么办?苹果手机如何远程登录?
阿里云服务器是云计算领域的一种重要服务,它可以帮助用户在云端部署和管理自己的应用程序和网站。但是,有时候用户可能会遇到远程桌面密码错误的问题,导致无法登录到服务器。本文将介绍一些解决办法,以及如何使用苹果手机远程登录…...
CRMEB多端多语言系统文件上传0Day代审历程
Git仓库: https://github.com/crmeb/CRMEB简介: 两天攻防中,某政局子公司官网后台采用的CRMEB开源商城CMS,挺奇葩,别问怎么总让我碰到这种东西,我也不知道,主打的就是一个魔幻、抽象。最后通过…...
孙哥Spring源码第18集
第18集 refresh()-invokeBeanFactoryPostProcessor-二-ConfigurationClassPostProcessor的处理逻辑 【视频来源于:B站up主孙帅suns Spring源码视频】【微信号:suns45】 1、为什么PropertySource先处理? 因为Conponent A在处理的过程中 要把…...
【STM32】文件系统FATFS与Flash的初步使用
文件系统简介 简介可以不看,直接看移植步骤 文件系统是介于应用层和底层间的模糊层。底层提供API,比如说使用SDIO或者SPI等读写一个字节。文件系统把这些API组合包装起来,并且提供一些列函数,我们可以使用这些函数进行更进一步的…...
Android Glide in RecyclerView,only load visible item when page return,Kotlin
Android Glide in RecyclerView,only load visible item when page return,Kotlin base on this article: Android Glide preload RecyclerView切入后台不可见再切换可见只加载当前视野可见区域item图片,Kotlin_zhangphil的博客…...
【SCI征稿】3个月左右录用!计算机信息技术等领域均可,如机器学习、遥感技术、人工智能、物联网、人工神经网络、数据挖掘、图像处理
计算机技术类SCIE&EI 【期刊简介】IF:1.0-2.0,JCR4区,中科院4区 【检索情况】SCIE&EI 双检,正刊 【参考周期】期刊部系统内提交,录用周期3个月左右,走完期刊部流程上线 【征稿领域】计算机信息…...
Golang 中的 crypto/ecdh 包详解
什么是 ECDH 算法? ECDH(Elliptic Curve Diffie-Hellman)算法是一种基于椭圆曲线的密钥交换协议,用于安全地协商共享密钥(Secret Key),步骤如下: 1. 选择椭圆曲线:ECDH…...
系统学习live555
文章目录 系统学习live555系统学习LIVE555的步骤:1.了解基本概念:2.**查看官方文档:**3.**下载和编译库:**4.**阅读示例代码:**5.**了解库结构:**6.**创建简单项目:**7.**阅读更多文档ÿ…...
Linux下的系统编程——进程的执行与回收(八)
前言: 前面我们对进程已经有了一个初步的了解与认识,现在让我们学习一下进程中一些函数的具体使用,比如exec可以执行一些指定的程序,wait / waitpid可以回收子进程,什么是孤儿进程,什么是僵尸进程…...
第十九章 ObjectScript - 执行例程
文章目录 第十九章 ObjectScript - 执行例程执行例程New 命令 第十九章 ObjectScript - 执行例程 执行例程 执行例程时,使用DO命令,如下所示: do ^routinename要执行一个过程、函数或子程序(不访问其返回值),可以使用以下命令: do label^ro…...
Podman安装与使用
1.Podman简介 Podman是一个无守护进程的容器引擎,用于在Linux系统上开发、管理和运行OCI容器。 Podman的主要功能包括: 创建和管理容器:Podman可以创建、启动、停止和删除容器,以及管理容器的生命周期。容器镜像管理࿱…...
C++ 嵌套循环
一个循环内可以嵌套另一个循环。C 允许至少 256 个嵌套层次。 语法 C 中 嵌套 for 循环 语句的语法: for ( init; condition; increment ) {for ( init; condition; increment ){statement(s);}statement(s); // 可以放置更多的语句 }C 中 嵌套 while 循环 语句的…...
锁( ReentrantLock,Synchronized)
1.lock和synchronized 语法层面 synchronized 是关键字,源码在 jvm 中,用 c 语言实现; Lock 是接口,源码由 jdk 提供,用 java 语言实现; 使用 synchronized 时,退出同步代码块锁会自动释放&…...
主频计算-架构真题(二十三)
某文件系统采用多级索引结构,若磁块大小为4K字节,每个块号需占4个字节,那么采用二级索引结构时的文件最大长度可占用()个物理块。 1、1024 2、1024*1024 3、2048*2048 4、4096*4096 答案: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限制
通常情况下:随着工作时间的增长,我们会保存许许多多的linux到本地的mobastream,然后当超过14个,就会被被限制,这个会让人很头疼。 1. 安装python,配置好环境变量 测试安装成功: 2. 基于项目进行…...
使用Redisson实现高并发抢红包
一、概述 1、简介 在传统的抢红包场景中,如果面临高并发请求,通常需要考虑加锁来保证数据的一致性。而在分布式环境下,为了解决分布式锁的问题,我们可以使用Redisson这样的分布式Java对象和服务框架来实现。 本篇博客将演示如何…...
【网络编程】TCP/IP协议(互联网的基石)
(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮࿰…...
【VS Code插件开发】自定义侧边栏、视图(六)
🐱 个人主页:不叫猫先生,公众号:前端舵手 🙋♂️ 作者简介:前端领域优质作者、阿里云专家博主,共同学习共同进步,一起加油呀! 📢 资料领取:前端…...
深入RealReachability FSM引擎:有限状态机在iOS网络检测中的终极应用指南
深入RealReachability FSM引擎:有限状态机在iOS网络检测中的终极应用指南 【免费下载链接】RealReachability We need to observe the REAL reachability of network. Thats what RealReachability do. 项目地址: https://gitcode.com/gh_mirrors/re/RealReachabi…...
如何开发Browser MCP自定义工具与资源扩展:完整指南
如何开发Browser MCP自定义工具与资源扩展:完整指南 【免费下载链接】mcp Browser MCP is a Model Context Provider (MCP) server that allows AI applications to control your browser 项目地址: https://gitcode.com/gh_mirrors/mcp16/mcp Browser MCP&a…...
从零开始搭建自己的POC库:GitHub爬取+本地管理全攻略
从零构建个人POC武器库:自动化采集与智能管理实战指南 在漏洞研究和渗透测试领域,拥有一个组织良好的POC(Proof of Concept)库就像战士拥有趁手的武器。本文将带你从零开始,通过自动化工具和系统化方法,打造…...
【LaTeX】学术论文高效排版:从零搭建初稿模板
1. 为什么你需要LaTeX论文模板? 第一次写学术论文时,我像大多数人一样打开了Word。结果光是调整格式就花了三天——页码突然跑到封面中间、参考文献编号莫名其妙重置、公式和图片永远对不齐。直到导师扔给我一个.tex文件说"用这个",…...
零基础快速入门前端CSS Transform 与动画核心知识点及蓝桥杯 Web 应用开发考点解析(可用于备赛蓝桥杯Web应用开发)
CSS 中的 transform(变换)和 animation(动画)是实现网页动态效果的核心工具,也是蓝桥杯 Web 应用开发赛道的高频考点一、CSS 2D 变换(transform)transform 用于对元素进行平移、旋转、缩放、倾斜…...
Nextcloud Android文件同步革命:实现跨设备无缝数据访问的完整指南 [特殊字符]
Nextcloud Android文件同步革命:实现跨设备无缝数据访问的完整指南 📱 【免费下载链接】android 📱 Nextcloud Android app 项目地址: https://gitcode.com/gh_mirrors/andr/android Nextcloud Android应用是一款功能强大的开源云存储…...
PyTorch分布式训练:原理与实践
PyTorch分布式训练:原理与实践 1. 背景与意义 随着深度学习模型的不断增大和数据集规模的持续增长,单GPU训练已经无法满足需求。分布式训练成为训练大型模型的必要手段,它可以显著缩短训练时间,提高模型性能。PyTorch提供了强大的…...
深大计算机考研复试全流程避坑指南:从机试环境、酒店选择到体检时机,这些细节别忽略
深大计算机考研复试全流程避坑指南:从机试环境到行程管理的实战策略 站在深大计算机楼前的那一刻,我才真正理解"细节决定成败"的含义——隔壁考场的同学因为酒店空调噪音彻夜未眠,机试时手指发抖敲错关键符号;而提前三个…...
Betaflight 4.5配置文件升级实战:从STM32H743到AOCODARC H7Dual的硬件适配指南
Betaflight 4.5硬件适配深度解析:从STM32H743到AOCODARC H7Dual的实战迁移指南 穿越机飞控系统的核心在于硬件与软件的完美协同,而Betaflight作为开源飞控领域的标杆,其4.5版本在硬件抽象层进行了重大革新。本文将聚焦STM32H743芯片与AOCODAR…...
告别数据标注!用Dynablox+Voxblox在ROS2上实现实时动态物体检测(保姆级配置)
零标注动态感知革命:DynabloxVoxblox在ROS2中的实战部署指南 当机器人在商场扶梯间遇到滚动的玩具球,或在仓库中识别扛着纸箱的工人时,传统基于深度学习的检测方法往往需要大量场景特定的标注数据。ETH Zurich与MIT联合发布的Dynablox技术&am…...
