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插件开发】自定义侧边栏、视图(六)
🐱 个人主页:不叫猫先生,公众号:前端舵手 🙋♂️ 作者简介:前端领域优质作者、阿里云专家博主,共同学习共同进步,一起加油呀! 📢 资料领取:前端…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...