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

django之视图

django vs drf

首先要区分django 和 django rest framework(drf)。

django是前后端不分离的,后端写模板(template)渲染成html之后返回给浏览器。

drf是适应前后端分离的架构,基于django做的封装,提供的rest API规范的框架。

什么是rest API。

它是一种开发api的风格范式。就像变量命名,你可以采用驼峰也可以下划线。

比如我要开发一套接口,实现对用户的新增、修改、删除,若果不适用rest风格,设计出的api可能是这样的。

uri作用
/ListUser获取用户列表
/GetUser/?id={id}获取单个用户
/AddUser新增用户
/ModifyUser修改用户信息
/DeleteUser删除用户信息

可以看出对于一个对象(用户)的多个操作(增删改)都是靠定义不同的URI来区分的。每个URI使用什么http method没有严格要求。

rest api则把对象和动作两个概念做了分离。动作使用http method标识,对象则是纯名词。

http methoduri作用
GET/User获取用户列表
GET/User/{id}获取单个用户
POST/User新增用户
PUT/User修改用户信息
DELETE/User删除用户信息

可以看到restful风格的API更加简洁清晰。

django的设计模式(MTV)

随着软件设计的发展,出现了分层的设计模式。比如web站点开发中常见的MVC(model、view、controller)模式,model负责持久化数据,view负责生成用户界面,controller负责处理业务逻辑。

django就是遵照MVC模式设计的,只不过名称做了修改,可以叫做MTV(model、template、view)。其中django中的template对应mvc中的view,django中的view对应mvc中的controller。

django的视图层

Django的视图层是处理业务逻辑的核心,它负责处理用户的请求并返回响应数据。

按照官方文档:https://docs.djangoproject.com/zh-hans/5.1/

视图层包含了url部分和视图部分(view)。

url部分:
在这里插入图片描述

url部分比较简单,就是维护了一个大的路由表,每个路由项包含了两部分,一个uri路径,一个对应的处理函数。另外就是一些基本的处理函数。

视图部分(两种编写视图的方式):

1、基于函数的视图(Function Base View, FBV)。

# 定义函数 hello_view.py
def hello(request, *argv, **kwarg):return HttpResponse("Hello, World!")# 把函数注册到路由表 url.py
from hello_view import hello
urlpatterns = [path('hello/', hello),
]

FBV的优点就是直观,直接url对应到了处理函数。缺点就是可复用性差。

2、基于类的视图(Class Based View, CBV)。

基于类的视图是我们要讲解的重点,其实并不复杂,只是因为众多的继承和混入,导致看不到你继承的view的全貌。

django中视图的基类为class view(),代码位于django\views\generic\base.py文件中。

# view视图很简单,只有一个变量和两个函数需要关注
class View:# 定义了所有支持的http方法http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']# 将类转化为函数,因为url那部分只支持函数def as_view(cls, **initkwargs)return self.dispatch(request, *args, **kwargs)# dispatch负责将请求根据http method转发到类对应的函数# 比如请求是get方法,则转发到def get()# 请求是post方法,则转发到def post()def dispatch(self, request, *args, **kwargs)return getattr(self, request.method.lower())

使用示例

# hello_view.py
class HelloView(View):def get(self, request, *args, **kwargs):return HttpResponse("Hello, get!")def post(self, request, *args, **kwargs):return HttpResponse("Hello, post!")# url.py
from hello_view import HelloView
urlpatterns = [path('hello/', HelloView.as_view()),
]

drf view

rest framework中的view/viewset因为层层继承和代码混入(mixin)的使用,看起来特别乱,尤其不知道什么场景下选择哪种view作为基类合适,下面简单说下我个人理解。

选择使用哪个作为基类的时候,只考虑以下三个即可:

APIView:当处理的对象中没有模型(model)操作、且逻辑相对简单时选择,如健康检测接口。只支持http方法定义的函数入口。

ViewSet:当处理的对象中没有模型(model)操作,但同一个类中有多个处理方法,可以通过@action添加自定义端点。

ModelViewSet:当处理对象中有模型(model)操作的CURD操作。

还有几个也可以用,但不推荐。比如GenericAPIView、GenericViewSet,我认为是一些在代码抽象泛化过程中的中间态类。虽然也可以用,但不用这些也可以过的更好。

APIView

APIView和django中View的主要区别就是对request、response进行了封装,还可以通过配置进行可插拔式的认证、权限校验等。

可以看出APIView做的工作主要是基础框架上的优化,所有的业务逻辑都需要自行编写。

class APIView(View):# 全局变量主要是一些认证、授权、限流等基础配置authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSESpermission_classes = api_settings.DEFAULT_PERMISSION_CLASSES# as_view函数的主要还是父类View的逻辑,即调用dispatch转发到对应方法函数def as_view(cls, **initkwargs):view = super().as_view(**initkwargs)   # 主流程def dispatch(self, request, *args, **kwargs): # 对request进行了封装,可以使用request.data获取用户通过POST, PUT和PATCH方法发过来的数据request = self.initialize_request(request, *args, **kwargs)try:# 认证、权限校验self.initial(request, *args, **kwargs)# 拿到对应的http method对应的处理函数# 比如请求是get方法,则转发到def get()# 请求是post方法,则转发到def post()handler = getattr(self, request.method.lower(),self.http_method_not_allowed)# 执行方法函数response = handler(request, *args, **kwargs)# 封装响应结果self.response = self.finalize_response(request, response, *args, **kwargs)def initial(self, request, *args, **kwargs):# 认证检查self.perform_authentication(request)# 权限检查self.check_permissions(request)# 限流检查self.check_throttles(request)

使用示例:

# hello_view.py
from rest_framework.views import APIView 
from rest_framework.response import Responseclass HelloApiView(APIView):# 自己实现get方法的处理逻辑def get(self, request, *args, **kwargs):return Response("Hello api, get!")# 自己实现post方法的处理逻辑def post(self, request, *args, **kwargs):return Response("Hello api, post!")# url.py
from hello_view import HelloApiView
urlpatterns = [path('hello_api/', HelloApiView.as_view()),
]

ViewSet

viewSet是继承了views.APIView和ViewSetMixin。

ViewSetMixin唯一的变化就是引入了action,因此viewSet做出的改变还是基础功能层面的,所有的业务逻辑仍然需要自行编写。

# rest_framework/viewsets.py
class ViewSetMixin:def as_view(cls, actions=None, **initkwargs):def get_extra_actions(cls):def reverse_action(self, url_name, *args, **kwargs):def get_extra_action_url_map(self):

ViewSetMixin主要就是重写了as_view函数,不再使用http方法作为处理函数的入口了,改成了action函数作为入口。其他的一些函数都是为了处理action引入做的相关处理。

ViewSet ActionHTTP 方法APIView 对应处理函数默认 URL 模式示例场景
listGETget()/资源路径/获取所有文章 GET /posts/
createPOSTpost()/资源路径/创建新文章 POST /posts/
retrieveGETget()/资源路径/{pk}/获取单篇文章 GET /posts/1/
updatePUTput()/资源路径/{pk}/全量更新文章 PUT /posts/1/
partial_updatePATCHpatch()/资源路径/{pk}/部分更新文章 PATCH /posts/1/
destroyDELETEdelete()/资源路径/{pk}/删除文章 DELETE /posts/1/
自定义 Action
@action(detail=False)自定义方法任意方法/资源路径/自定义动作名/批量操作 POST /posts/bulk_delete/
@action(detail=True)自定义方法任意方法/资源路径/{pk}/自定义动作名/点赞文章 POST /posts/1/like/

使用示例:

# hello_viewset.py
from rest_framework.viewsets import ViewSet
from rest_framework.response import Responseclass HelloViewSet(ViewSet):def list(self, request):return Response("Hello viewset, get!"))# url.py
from hello_viewset import HelloViewSetsystem_url = routers.SimpleRouter()
system_url.register(r'hello', HelloViewSet, basename='hello')urlpatterns += system_url.urls

ModelViewSet

modelViewSet默认提供了对模型的增删改查操作,极大的简化了常规模型操作的代码量。

# rest_framework/viewsets里面的ModelViewSet代码
class ModelViewSet(mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin,GenericViewSet):# 可以看出ModelViewSet下面其实没有代码,都是靠继承来的
# 以下是继承关系图
APIView   
└── GenericAPIView└── GenericViewSet (ViewSetMixin + GenericAPIView)└── ModelViewSet# APIView:前面说过了,封装了请求和响应,增加了权限认证等基础模块。
# GenericAPIView:提供了模型的定义和模型的基本操作函数,如get_queryset()等。
# GenericViewSet:引入了action
# ModelViewSet:加入了mixins中的CreateModelMixin、UpdateModelMixin等,才把所有散件串联起来。

所以想要理解ModelViewSet,就得先把GenericAPIView、GenericViewSet还有关键的mixin类搞清楚。

GenericAPIView(零件工厂)

GenericAPIView定义了对模型操作的基础方法,比如查询结果集、对结果集进行分页、过滤等。这些方法就像一个个零件工厂,比如玻璃厂、轮胎厂、螺丝厂,但它并不提供组装,只有组装厂才决定了把这些零件造成是汽车还是自行车还是坦克。

# rest_framework/generics.py
class GenericAPIView(views.APIView):# 基础查询结果集queryset = None# 序列化类serializer_class = None# 过滤、排序的类filter_backends = api_settings.DEFAULT_FILTER_BACKENDS# 分页的类pagination_class = api_settings.DEFAULT_PAGINATION_CLASS# 获取全量结果集,就是上面定义的self.queryset,可重写此方法实现定制def get_queryset(self):# 获取单条记录def get_object(self):# 获取序列化后的数据def get_serializer(self, *args, **kwargs):# 获取序列化的类def get_serializer_class(self):# 过滤数据def filter_queryset(self, queryset):# 对数据进行分页def paginate_queryset(self, queryset):

mixins(组装工厂)

mixins里的类就提供了组装方法,有新增数据的CreateModelMixin,有修改数据的UpdateModelMixin。但组装厂没有零件是干不了任何事的,所以mixins里的代码必需得以GenericAPIView(零件工厂)为基础进行使用。

# rest_framework/mixins.py
# 新增数据的逻辑,可以看出创建数据和核心逻辑数据校验和保存数据都是在序列化类中定义的
class CreateModelMixin:def create(self, request, *args, **kwargs):# 获取序列化类serializer = self.get_serializer(data=request.data)# 校验数据的约束条件serializer.is_valid(raise_exception=True)# 执行创建self.perform_create(serializer)headers = self.get_success_headers(serializer.data)# 返回结果return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)def perform_create(self, serializer):serializer.save()class ListModelMixin:   def list(self, request, *args, **kwargs):# 过滤、排序queryset = self.filter_queryset(self.get_queryset())# 排序page = self.paginate_queryset(queryset)if page is not None:serializer = self.get_serializer(page, many=True)return self.get_paginated_response(serializer.data)serializer = self.get_serializer(queryset, many=True)return Response(serializer.data)class RetrieveModelMixin:def retrieve(self, request, *args, **kwargs):# 获取单行数据instance = self.get_object()# 序列化后返回serializer = self.get_serializer(instance)return Response(serializer.data)# 全行更新和部分字段更新的逻辑,核心逻辑还是在序列化类中执行
class UpdateModelMixin:def update(self, request, *args, **kwargs): # 是否是只更新部分字段     partial = kwargs.pop('partial', False)instance = self.get_object()serializer = self.get_serializer(instance, data=request.data, partial=partial)serializer.is_valid(raise_exception=True)self.perform_update(serializer)if getattr(instance, '_prefetched_objects_cache', None):# If 'prefetch_related' has been applied to a queryset, we need to# forcibly invalidate the prefetch cache on the instance.instance._prefetched_objects_cache = {}return Response(serializer.data)def perform_update(self, serializer):serializer.save()# 只更新部分字段def partial_update(self, request, *args, **kwargs):kwargs['partial'] = Truereturn self.update(request, *args, **kwargs)class DestroyModelMixin:def destroy(self, request,*args, **kwargs):instance = self.get_object()self.perform_destroy(instance)return Response(status=status.HTTP_204_NO_CONTENT)def perform_destroy(self, instance):instance.delete()

零件 + 组装打包后的独立工厂

为了方便用户,是否可以提供开箱即用的工厂模式,不要用户用之前还得自己组装。

有的,主要有两类,

一类是支持原始http方法的,位于generics.py文件里,以APIView作为标识的。

一类是支持action方法的,位于viewsets.py文件里,以ModelViewSet作为标识的。

# 支持原始http方法的独立工厂有,可以看出APIView类的方法,是在内部做了http方法到action方法的转化。
class CreateAPIView(mixins.CreateModelMixin,GenericAPIView):def post(self, request, *args, **kwargs):return self.create(request, *args, **kwargs)class ListAPIView(mixins.ListModelMixin,GenericAPIView):def get(self, request, *args, **kwargs):return self.list(request, *args, **kwargs)class RetrieveAPIView(mixins.RetrieveModelMixin,GenericAPIView):def get(self, request, *args, **kwargs):return self.retrieve(request, *args, **kwargs)class DestroyAPIView(mixins.DestroyModelMixin,GenericAPIView):def delete(self, request, *args, **kwargs):return self.destroy(request, *args, **kwargs)
……# 支持action方法的独立工厂有
class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,mixins.ListModelMixin,GenericViewSet):class ModelViewSet(mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin,GenericViSet):

虽然generics.py里的类也是可以开箱及用的,但是还是需要用户了解细节,才能更好的组装使用,比如CreateAPIView只提供新增,如果希望同时支持新增和列表查询,就需要再加一个继承类mixins.ListModelMixin。

另外APIView不支持action,也就不能通过自定义action实现灵活的路由定制。所以综合下来,直接使用ModelViewSet更新,generics.*里的内容白白加重了我的选择困难症。

使用示例:

################################
## 使用APIView类
################################# hello_listApiView.py
from rest_framework.generics import ListAPIView
from models import Area
from serializers import AreaSerializer# 只包含获取列表功能
class HelloListAPIView(ListAPIView):queryset = Area.objects.all()serializer_class = AreaSerializer# url.py
from hello_listApiView import HelloListAPIViewsystem_url = routers.SimpleRouter()urlpatterns = [path('hello/', HelloListAPIView.as_view()),
]urlpatterns += system_url.urls################################
## 使用ModelViewSet类
################################# hello_ModelViewSet.py
from rest_framework.viewsets import ModelViewSet
from models import Area
from serializers import AreaSerializer# 提供了所有对模型的增删该查功能,代码还是这么多,大大节省了代码量
class HelloModelViewSet(ModelViewSet):queryset = Area.objects.all()serializer_class = AreaSerializer# url.py
from hello_ModelViewSet import HelloModelViewSetsystem_url = routers.SimpleRouter()
system_url.register(r'hello', HelloModelViewSet, basename='hello')urlpatterns += system_url.urls

相关文章:

django之视图

django vs drf 首先要区分django 和 django rest framework(drf)。 django是前后端不分离的,后端写模板(template)渲染成html之后返回给浏览器。 drf是适应前后端分离的架构,基于django做的封装,提供的rest API规范…...

深入探讨dubbo组件的实践

目录 1、dubbo概述 1.1、介绍 1.2、RPC 1.3、区别 1.4、优点 2、dubbo分层 2.1、层级分类 1. Service 服务层(业务层) 2. Config 配置层 3. Proxy 服务代理层 4. Registry 注册中心层 5. Cluster 集群容错层 6. Monitor 监控层 7. Protoco…...

2.1 微积分基本想法

总结性表达 微积分的核心思想在于用简单图形逼近复杂形状的面积。牛顿与莱布尼茨通过"以直代曲"的突破性思路,将曲线围成的面积分解为无限个矩形之和,形成两大核心工具: 极限思想:通过无限细分矩形底边(Δ…...

学习threejs,使用Physijs物理引擎,加载各种几何体网格对象

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️Physijs 物理引擎1.1.1 ☘️…...

Excel分组计算求和的两种实现方案

文章目录 背景样例数据方案一、函数求和实现步骤 方案二、数据透视表实现步骤 背景 在Excel文档中,经常会进行数据的求和计算,可使用不同的方式实现,记录下来,方便备查。 样例数据 已有商品销量信息,包含销售日期、…...

nestjs[一文学懂如何在nestjs中对npm功能包封装]

问题描述 NPM(Node Package Manager)是Node.js的包管理工具,它允许开发者轻松地分享、安装和管理依赖包,促进了代码的复用性和项目协作。而npm插件库将是nodejs开发中不可缺失的重要组成因素。 在nestjs中,官方已经给…...

PHP 连接和使用 Kafka 的指南

首先说明,我的是系统版本是:Ubuntu 22.04.3,下面是详细步骤 ###### PHP 连接和使用 Kafka 的指南 ###### # 安装依赖 sudo apt-get install -y librdkafka-dev # 安装必要的依赖 # 对于 Ubuntu/Debian sudo apt-get update sudo apt-get in…...

# 07_Elastic Stack 从入门到实践(七)---1

07_Elastic Stack 从入门到实践(七)—1 一、Filebeat入门之读取 Nginx 日志文件 1、首先启动 Elasticsearch 集群 和 Nginx 服务,打开GoogleChrome 浏览器,点击 elasticsearch-head 插件,连接Elasticsearch 集群 服务器。 # 查看网卡名 $ ip addr# 修改网卡配置,改为…...

CSS-PureCss样式开发

CSS-PureCss样式开发 1-开发说明 1-引入Pure.css2-直接拷贝代码 2-参考网址 purecss中文网 3-代码模板 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"wid…...

学习笔记:Conda 环境共享

1. 环境共享的重要性 环境共享是协作项目中非常实用的功能&#xff0c;它能确保整个项目的协作人员都使用相同的软件包&#xff0c;并保证这些包的版本正确。这可以避免因环境配置不同而导致的“在我的机器上可以运行”之类的问题。 2. 导出当前环境配置 如果需要将当前的 C…...

蓝牙AVDTP协议概述

1.AVDTP 概念 AVDTP 即 AUDIO/VIDEO DISTRIBUTION TRANSPORT PROTOCOL&#xff08;音视频分配传输协 议&#xff09;&#xff0c;主要负责 A/V stream 的协商、建立及传输程序&#xff0c;还指定了设备之前传输 A/V stream 的消息格式. AVDTP 的传输机制和消息格式是以 RTP 为基…...

Java面试终极篇:Sentinel+Seata+Kafka Streams高并发架构实战

面试官&#xff1a;张总&#xff08;严肃脸&#xff09; 程序员&#xff1a;小王&#xff08;紧张冒冷汗&#xff09; 第一轮&#xff1a;分布式基础 张总&#xff1a;说说Spring Cloud Alibaba的Sentinel和Nacos的区别&#xff1f; 小王&#xff1a;&#xff08;结巴&#…...

提权相关记录

Windows potato本地提权 常见potato提权&#xff1a;BadPotato、EfsPotato、SweetPotato、JuicyPotato0、PrintNotifyPotato、RottenPotato 提权前置条件&#xff1a;拥有SeImpersonatePrivilege或SeAssignPrimaryTokenPrivilege权限其中一个。 可以通过命令whoami /priv或whoa…...

信息化、数字化、数智化之间的区别和联系

在如今这个信息技术飞速发展的时代&#xff0c;我们常常会听到“信息化”、“数字化”和“数智化”这三个术语。对于大多数人来说&#xff0c;这些词汇听起来既高深又晦涩&#xff0c;但其实它们和我们的生活、工作密切相关。如果你能理解它们的概念与区别&#xff0c;你不仅能…...

制造业IT管理方法论:柔性变更与数据治理的融合实践

1. 引言 随着工业4.0时代的深入发展&#xff0c;信息技术&#xff08;IT&#xff09;与运营技术&#xff08;OT&#xff09;的融合日益紧密&#xff0c;对制造企业的IT管理提出了前所未有的挑战与机遇。传统的IT管理框架&#xff0c;如ITIL&#xff08;信息技术基础架构库&…...

深入了解 gmx_RRCS:计算原理、操作步骤及输出文件解析

前段时间&#xff0c;我写了一篇介绍gmx_RRCS的推文&#xff0c;之后有不少人希望我能再出一个更详细的版本&#xff0c;尤其是对gmx_RRCS输出文件含义进行解读。大家的反馈我都看到了&#xff0c;所以准备再写一篇&#xff0c;仔细讲讲输出文件里各项内容是什么意思&#xff0…...

MySQL 8.0 OCP 1Z0-908 题目解析(1)

题目001 Choose two. User fwuserlocalhost is registered with the SQL Enterprise Firewall and has been granted privileges for the sakila database. Examine these commands that you executed and the results: mysql> SELECT MODE FROM INFORMATION_SCHEMA.SQL…...

【漫话机器学习系列】254.假设空间(Hypothesis Space)

假设空间&#xff08;Hypothesis Space&#xff09;详解&#xff1a;理解模型选择的核心概念 在机器学习、深度学习、统计建模等领域&#xff0c;我们常常会听到一个专业术语——假设空间&#xff08;Hypothesis Space&#xff09;。假设空间的理解&#xff0c;直接关系到模型…...

【Game】Powerful——Hero Trial(11)

文章目录 1、阵容推荐2、第一章 绝望之境3、第二章 万剑之殇4、第三章 自然之力5、第四章 1、阵容推荐 我一般都是&#xff0c;三物理&#xff0c;一封&#xff0c;一辅助&#xff0c;或者双物理一法系&#xff0c; 物理优先单攻的&#xff0c;比如天策、五庄、天魔&#xff0…...

Java MVC

在软件开发中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;是一种常用的设计模式&#xff0c;它将应用程序分为三个核心部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff09;。这…...

单片机Day10

对向流水 #include <REGX51.H> typedef unsigned int u16; typedef unsigned char u8; #define led P2 void delay_10us(u16 t) { while(t--); } void main() { while(1) { P20x7e; delay_10us(50000); P20xbd; delay_10us(50000); P20xdb; delay_10us(50000); P20xe7; …...

大语言模型训练的两个阶段

先说结论&#xff1a;第一阶段在云平台训练至收敛 第二阶段本地GPU微调 一、阶段划分的核心逻辑 阶段目标资源特点典型耗时占比成本敏感度预训练获取通用表征能力需要大规模分布式计算70-90%高&#xff08;追求每美元算力&#xff09;微调适配特定任务需要领域数据安全/低延迟…...

ACL访问控制列表:access-list 10 permit 192.168.10.1

ACL访问控制列表 标准ACL语法 1. 创建ACL access-list <编号> <动作> <源IP> <通配符掩码> // 编号范围 1-99 // 动作&#xff1a;permit 允许 、 deny 拒绝2. 示例 //允许192.168.1.0/24g整个网络,0.0.0.255 反掩码 access-list 10 permit 192.1…...

高粘度、强腐蚀介质解决方案:V型气动带手动活塞式开关调节球阀的五大核心优势-耀圣控制

高粘度、强腐蚀介质解决方案&#xff1a;V型气动带手动活塞式开关调节球阀的五大核心优势 在石油化工、污水处理、锂电材料等工业场景中&#xff0c;含有颗粒的高粘度介质、料浆及强腐蚀性流体对阀门的性能提出了极高要求。传统球阀易因介质沉积、腐蚀或卡阻导致失效&#xff…...

后端开发面试高频50个问题,简单解答

以下是后端开发面试中常见的50个高频问题及其详细解答&#xff0c;涵盖了语言基础、数据库、网络、操作系统、设计模式等多个方面&#xff1a; 编程语言基础 Java 中的 final 关键字有什么作用&#xff1f; final 可以修饰类、方法和变量。修饰类时&#xff0c;类不能被继承&am…...

LayerNorm vs RMSNorm 技术对比

1. 核心概念 LayerNorm (层归一化) 思想&#xff1a;对单个样本的所有特征维度进行归一化目标&#xff1a;使每个样本的特征分布 μ 0 \mu0 μ0&#xff0c; σ 1 \sigma1 σ1特点&#xff1a;同时调整均值和方差 RMSNorm (均方根归一化) 思想&#xff1a;基于均方根的简…...

基于SpringBoot的校园周边美食探索及分享平台【附源码+数据库+文档下载】

一、项目简介 本项目是一个基于 SpringBoot Vue 的校园周边美食探索与分享平台&#xff0c;专为在校大学生开发&#xff0c;集美食推荐、好友互动、收藏分享于一体。 通过平台&#xff0c;用户可以探索学校周边的美食店铺、发布美食鉴赏、添加好友进行交流分享。同时&#x…...

开启WSL的镜像网络模式

开启WSL的镜像网络模式 前提 Windows主机系统版本高于Windows 11 22H2。WLS版本>2.0。 可输入wsl --version查看当前系统wsl版本。 修改设置 图形界面修改 在开始菜单中搜索&#xff1a;wsl settings&#xff0c;结果如下图所示&#xff1a; 点击“打开”&#xff0…...

传导发射中的模拟手

“模拟手”是按照国际 EMC 标准&#xff08;如 CISPR 16-1-2, CISPR 22, GB/T 9254 等&#xff09;中规定的&#xff0c;用于 测试带有接地金属外壳或信号线接口设备在接地或金属表面触摸时的传导发射性能。有些设备在“无触摸”时能通过传导发射&#xff0c;但一旦接地或接手&…...

Femap许可使用统计与分析

在电磁仿真领域&#xff0c;Femap作为一款高效且功能强大的工具&#xff0c;广泛应用于各种复杂场景。随着企业规模的扩大和团队协作的加强&#xff0c;如何有效地管理和利用Femap许可证资源成为了关注的焦点。本文将向您介绍Femap许可使用统计与分析的重要性&#xff0c;以及如…...

接口自动化测试设计思路--设计实战

课程&#xff1a;B站大学 记录python学习&#xff0c;直到学会基本的爬虫&#xff0c;使用python搭建接口自动化测试就算学会了&#xff0c;在进阶webui自动化&#xff0c;app自动化 接口自动化测试设计思路 如何进行接口自动化测试设计思路&#xff1f;1. 背景2. 设计目标3. 框…...

华为FAT AP配置 真机

FAT AP 的主要特点 特性说明独立工作不需要AC&#xff08;无线控制器&#xff09;&#xff0c;自己处理认证、加密、漫游等功能。内置完整功能支持SSID、安全策略&#xff08;WPA/WPA2&#xff09;、VLAN、QoS、DHCP等。适合小型网络适用于家庭、小企业、分支机构等少量AP的场…...

Node.js中那些常用的进程通信方式

文章目录 1 什么是子进程?2 核心方法详解2.1 `child_process.spawn(command, [args], [options])`2.2 `child_process.exec(command, [options], callback)`2.3 `child_process.execFile(file, [args], [options], callback)`2.4 `child_process.fork(modulePath, [args], [op…...

spring中的@PropertySource注解详解

一、核心功能与作用 PropertySource是Spring框架中用于加载外部配置文件的核心注解&#xff0c;主要作用是将属性文件&#xff08;如.properties、.yml&#xff09;的键值对加载到Spring的Environment环境中&#xff0c;实现配置与代码的解耦。其核心价值包括&#xff1a; 外部…...

软件设计师-错题笔记-系统开发与运行

1. 解析&#xff1a; A&#xff1a;模块是结构图的基本成分之一&#xff0c;用矩形表示 B&#xff1a;调用表示模块之间的调用关系&#xff0c;通过箭头等符号在结构图中体现 C&#xff1a;数据用于表示模块之间的传递的信息&#xff0c;在结构图中会涉及数据的流向等表示 …...

豆瓣电影Top250数据工程实践:从爬虫到智能存储的技术演进(含完整代码)

目录 引言:当豆瓣榜单遇见大数据技术 项目文档 1.1 选题背景 1.2 项目目标 2. 项目概述 2.1 系统架构设计 2.2 技术选型 2.3 项目环境搭建 2.3.1 基础环境准备 2.3.2 爬虫环境配置 2.3.3 Docker安装ES连接Kibana 安装IK插件 2.3.4 vscode依赖服务安装 3. 核心模…...

【Dv3Admin】工具数据验证配置文件解析

在 Django Rest Framework (DRF) 中&#xff0c;数据验证是确保系统安全和稳定运行的核心部分。dvadmin/utils/validator.py 提供了定制化的验证器&#xff0c;扩展了 DRF 默认的验证功能&#xff0c;帮助开发者在处理字段唯一性验证、数据查询等方面更为高效和安全。 本文详细…...

ExcelJS库的使用

ExcelJS 安装 npm install exceljs新的功能! Merged fix: styles rendering in case when “numFmt” is present in conditional formatting rules (resolves #1814) #1815. Many thanks to andreykrupskii for this contribution!Merged inlineStr cell type support #15…...

主从架构:技术原理与实现

一.简单介绍分布式锁的复习 今天在一个分布式锁的视频讲解中&#xff0c;提到了主从架构&#xff0c;所以有了这篇文章。 当然我们可以先说说分布式锁&#xff0c;可以使用redis的setnxlua脚本实现&#xff0c;或者也可以用redission实现&#xff0c;或者看门狗机制。 由看门…...

8天Python从入门到精通【itheima】-1~5

目录 1节&#xff1a; 1.Python的优势&#xff1a; 2.Python的独具优势的特点&#xff1a; 2节-初识Python&#xff1a; 1.Python的起源 2.Python广泛的适用面&#xff1a; 3节-什么是编程语言&#xff1a; 1.编程语言的作用&#xff1a; 2.编程语言的好处&#xff1a;…...

JVM之垃圾回收器

部分内容来源&#xff1a;JavaGuide&#xff0c;二哥Java 垃圾回收器快速复习 JDK 8: Parallel Scavenge&#xff08;新生代&#xff09; Parallel Old&#xff08;老年代&#xff09; JDK8: Serial Serial Old JDK 9 ~ JDK22: G1 新生代&#xff1a;标记-复制算法 老年代&…...

【K8S学习之生命周期钩子】详细了解 postStart 和 preStop 生命周期钩子

0. 参考 Kubernetes容器生命周期 —— 钩子函数详解&#xff08;postStart、preStop&#xff09; - 人艰不拆_zmc - 博客园详解Kubernetes Pod优雅退出 - 人艰不拆_zmc - 博客园 1. Kubernetes 生命周期钩子概述 在 Kubernetes 中&#xff0c;生命周期钩子&#xff08;Lifec…...

深度强化学习有什么学习建议吗?

什么是强化学习&#xff1f; 广泛地讲&#xff0c;强化学习是机器通过与环境交互来实现目标的一种计算方法。机器和环境的一 轮交互是指&#xff0c;机器在环境的一个状态下做一个动作决策&#xff0c;把这个动作作用到环境当中&#xff0c;这个环 境发生相应的改变并且将相应…...

Flutter - UIKit开发相关指南 - 控制器,主题,表单

环境 Flutter 3.29 macOS Sequoia 15.4.1 Xcode 16.3 控制器(ViewControllers) 在UIKit中,通过ViewController控制数据在视图上展现,多个ViewController组合在一起构建复杂的用户界面。在Flutter中,因为所有都是Widget,所以ViewController相关的功能也由Widget来承担。 生命周…...

嵌入式软件开发常见warning之 warning: implicit declaration of function

文章目录 &#x1f9e9; 1. C 编译流程回顾&#xff08;背景&#xff09;&#x1f4cd; 2. 出现 warning 的具体阶段&#xff1a;**编译阶段&#xff08;Compilation&#xff09;**&#x1f9ec; 2.1 词法分析&#xff08;Lexical Analysis&#xff09;&#x1f332; 2.2 语法分…...

AI赋能安全生产,推进数智化转型的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用…...

(六)毛子整洁架构(测试)

文章目录 项目地址一、 项目地址 教程作者&#xff1a;教程地址&#xff1a; 代码仓库地址&#xff1a; 所用到的框架和插件&#xff1a; dbt airflow一、...

Vue3 Echarts 3D饼图(3D环形图)实现讲解附带源码

文章目录 前言一、准备工作1. 所需工具2. 引入依赖方式一&#xff1a;CDN 快速引入方式二&#xff1a;npm 本地安装&#xff08;推荐&#xff09; 二、实现原理解析三、echarts-gl 3D插件 使用回顾grid3D 常用通用属性&#xff1a;series 常用通用属性&#xff1a;surface&…...

Java大师成长计划之第20天:Spring Framework基础

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4o-mini模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中关键数据、代码与结论建议通过官方渠道验证。 在Java开发领域&#xff0c;Spring …...

WebSocket集成方案对比

​ WebSocket集成方案对比与实战 架构选型全景图 #mermaid-svg-BEuyOkkoP6cFygI0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BEuyOkkoP6cFygI0 .error-icon{fill:#552222;}#mermaid-svg-BEuyOkkoP6cFygI0 .er…...