DRF视图基类使用方法

【 一 】drf之请求

请求对象Request

【 0 】前言

​ 在 Python 中,通常通过 request 对象来处理 HTTP 请求,尤其是在 web 开发中,比如使用 Django、Flask 等框架时会经常接触到这个对象。request 对象是框架提供的,用于封装客户端发送的 HTTP 请求,并提供了访问请求头、请求体、请求参数等信息的方法和属性。

对于 Django 框架而言,request 对象是 Django 中视图函数的一个参数,表示客户端发送的 HTTP 请求。下面是一些常用的 request 对象的属性和方法:

  1. 属性
    • request.method:HTTP 请求方法,如 GET、POST、PUT、DELETE 等。
    • request.GET:包含 GET 请求参数的 QueryDict 对象。
    • request.POST:包含 POST 请求参数的 QueryDict 对象。
    • request.FILES:包含文件上传的文件对象的字典。
    • request.path:请求的路径部分,不包括域名和查询参数。
    • request.headers:请求头部信息,以字典形式保存。
  2. 方法
    • request.get():获取指定 key 的 GET 请求参数值。
    • request.post():获取指定 key 的 POST 请求参数值。
    • request.getlist():获取指定 key 的参数值列表,适用于多个相同 key 的参数情况。
    • request.is_ajax():判断请求是否为 AJAX 请求。
    • request.user:当前登录用户的信息(需要身份验证的情况下)。
from rest_framework.request import Request
# 该Request没有继承django原生的HttpRequest

REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST framework提供的扩展了HttpRequest类的Request类的对象。

REST framework 提供了Parser解析器,在接收到请求后会自动根据Content-Type指明的请求数据类型(如JSON、表单等)将请求数据进行parse解析,解析为类字典[QueryDict]对象保存到Request对象中。

Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果。

无论前端发送的哪种格式的数据,我们都可以以统一的方式读取数据。

【 1 】常用属性

'''
request.data 字典
返回解析之后的请求体数据。类似于Django中标准的request.POST和request.FILES属性,但提供如下特性:包含了解析之后的文件和非文件数据包含了对POST、PUT、PATCH请求方式解析后的数据利用了REST framework的parsers解析器,不仅支持表单类型数据,也支持JSON数据request.query_params
request.query_params与Django标准的request.GET相同,只是更换了更正确的名称而已。
@property
def query_params(self):
return self._request.GET
'''

【 2 】补充:

查找顺序:

  • 先从视图类中找
  • 项目的配置文件中找settings.py
  • 最后再到DRF的默认配置去找drf–>settings.py文件

drf的Request对象可以调用django原生的request对象的属性和方法 这是因为drf的Request类用_request属性封装了原生django的request

  	# 这是因为drf的Request类重写了__getattr__方法,代理了原生了request        
self._request = request	# request是django原生的request
def __getattr__(self, attr): # 当调用的属性不存在时触发__getattr__()return getattr(self._request, attr) 

【 1 】控制解析格式使用

# 3 控制解析格式使用-1 视图类中局部使用class RequestView(APIView):parser_classes = [JSONParser, FormParser]-2 全局配置文件使用REST_FRAMEWORK = {'DEFAULT_PARSER_CLASSES': [# 'rest_framework.parsers.JSONParser',# 'rest_framework.parsers.FormParser','rest_framework.parsers.MultiPartParser',],}-3 全局配了,局部重新配置class RequestView(APIView):parser_classes = [ FormParser]
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.parsers import JSONParser,FormParser,MultiPartParser
class ReqsuetView(APIView):# 第一种方法# 设置解析器类列表,包括 JSONParser 和 FormParser、MultiPartParserparser_classes = [JSONParser, FormParser,MultiPartParser]def post(self,request):# form-data格式携带文件和数据---> 数据在request.data 中 ---> 文件request.data,也在request.FILES中# 但是request.data 这种方法不推荐print(request.data)#< QueryDict: {'myssda': [ < TemporaryUploadedFile: ffmpeg.dll(application / x - msdownload) >]} >FILES = request.FILESprint(FILES)# < MultiValueDict: {'myssda': [ < TemporaryUploadedFile: ffmpeg.dll(application / x - msdownload) >]} >return Response({"code":'200',"msg":request.data})
  • settings.py配置文件

DEFAULTS = {# 去rest_framework源码中去找settings.py文件# 可以使用三种方法'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser',# 'rest_framework.parsers.FormParser',# 'rest_framework.parsers.MultiPartParser',],}
# 第三种
全局配了,局部重新配置(不推荐使用)
class RequestView(APIView):
parser_classes = [ FormParser]

【 二 】drf之响应

响应对象Response

from rest_framework.response import Response
# 该Response继承了django原生的HttpResponse

【 0 】前言

REST framework提供了一个响应类Response,使用该类构造响应对象时,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。

REST framework提供了Renderer 渲染器,用来根据请求头中的Accept(接收数据类型声明)来自动转换响应数据到对应格式。如果前端请求中未进行Accept声明,则会采用默认方式处理响应数据,我们可以通过配置来修改默认响应格式。

可以在rest_framework.settings查找所有的drf默认配置项

必须在配置文件中注册app–> rest_framework

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','one.apps.OneConfig',# 这个重要'rest_framework',
]

【 1 】源码解析

# 构造方式
from rest_framework.response import Response
def __init__(self, data=None, status=None,template_name=None, headers=None,exception=False, content_type=None):
# 参数说明    - data:你要返回的数据,字典- status:返回的状态码,默认是200,使用如常量用更加见名知意from rest_framework import statusHTTP_100_CONTINUE = 100HTTP_200_OK = 200HTTP_201_CREATED = 201。。。。。		- template_name 渲染的模板名字(自定制模板),不需要了解- headers:响应头,可以往响应头放东西,就是一个字典- content_type:响应的编码格式,application/json和text/html;#### 重要的###
data
status
headers# 补充:报django-session表不存在-前端带了 sessionid---》到后端,它就会django-session中取数据,取不到就报错了

data数据不是render处理之后的数据,只需传递python的内建类型数据即可,REST framework会使用renderer渲染器处理data

data不能是复杂结构的数据,如Django的模型类对象,对于这样的数据我们可以使用Serializer序列化器序列化处理后(转为了Python字典类型)再传递给data参数。

  • Response对象属性

# response.data传给response对象的序列化后,但尚未render处理的数据
# response.status_code状态码的数字
# response.content经过render处理后的响应数据

【 2 】响应格式

优先用 视图类的—》项目配置文件—》drf内置的(两个都支持)

# 浏览器响应成浏览器的格式,postman响应成json格式,通过配置实现的(默认配置)
#不管是postman还是浏览器,都返回json格式数据
# drf有默认的配置文件---》先从项目的setting中找,找不到,采用默认的
# drf的配置信息,先从自己类中找--》项目的setting中找---》默认的找
-局部使用:对某个视图类有效-在视图类中写如下from rest_framework.renderers import JSONRendererrenderer_classes=[JSONRenderer,]-全局使用:全局的视图类,所有请求,都有效
-在项目的setting.py中加入如下REST_FRAMEWORK = {'DEFAULT_RENDERER_CLASSES': (  # 默认响应渲染类'rest_framework.renderers.JSONRenderer',  # json渲染器'rest_framework.renderers.BrowsableAPIRenderer',  # 浏览API渲染器,如果注释这一行使用浏览器打开接口的时候就不会有模板渲染)}
  • 'rest_framework.renderers.JSONRenderer':这个渲染器类负责将数据渲染为 JSON 格式。
    • 当 API 视图返回一个响应时,如果没有指定特定的渲染器,Django REST Framework 就会默认使用这个渲染器将数据转换为 JSON 格式,并将其作为 HTTP 响应的内容返回给客户端。
  • 'rest_framework.renderers.BrowsableAPIRenderer':这个渲染器类负责将 API 数据渲染为可浏览的 HTML 格式,以便在浏览器中进行浏览和交互。
    • 它提供了一个友好的界面,可以浏览 API 的端点、查看请求和响应的数据,并且还支持用户在浏览器中进行测试和调试 API。
# 控制解析格式使用
# 响应对象
# ------------------------------
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
class ReqsuetView(APIView):# 第一种方法# 设置解析器类列表,包括 JSONRenderer, BrowsableAPIRendererrenderer_classes = [JSONRenderer, BrowsableAPIRenderer]def post(self,request):print(request.data)FILES = request.FILESprint(FILES)return Response({"code":'200',"msg":request.data})def get(self,request):res = Response(data={},status=201,headers={'name':'jingyi'})print(res.status_text)return res

【 三 】基于APIView的两个视图基类(重要)

【 0 】前言

# 两个视图基类APIViewGenericAPIView

APIView—>之前我们是一直在用来实现接口的增删改查—》drf提供的最顶层的父类—》以后所有视图类,都继承自它

GenericAPIView(就是小弟)–》继承自APIView–》封装

【2】GenericAPIView的使用方法

  • GenericAPIView

    • 如果要写publish的5个接口,所有代码不变,只需要改两个类属性即可

    • #  # many=True 表示序列化器将处理多个对象而不是单个对象。
    • '''
      GenericAPIView:
      两个类属性:queryset和serializer_class
      '''
      # 三个方法:
      self.get_object()  # 获取单个数据  
      self.get_serializer()   # 序列化类
      self.get_queryset()  # 获取多个数据
      

【1】GenericAPIView + 序列化类 + Response

from rest_framework.generics import GenericAPIView# GenericAPIView + 序列化类 + Response
class BookView(GenericAPIView):#   继承GenericAPIView的写法# 在类中,写两个类属性:所有数据,序列化类# 拿到所有的数据 (拿多条数据)queryset = Book.objects.all()# 序列化类serializer_class = BookSerializer# 查询所有图书def get(self, request):# 使用get_queryset方法获取所有数据,而不是使用self.get_queryset() 属性获取res_list = self.get_queryset()# 使用序列化类 -- > 直接使用方法: self.serializer_class()serializer = self.serializer_class(instance=res_list,many=True)return Response({"code":200,"msg":"查询成功!!!","results": serializer.data})def post(self, request):# 使用序列化类 -- > 直接使用方法: self.serializer_class()res_data = self.serializer_class(data=request.data)if res_data.is_valid():# 验证过后的数据print(res_data.validated_data)# 保存数据res_data.save()return Response({"code":200,"msg":"添加成功!!!","results": res_data.data}, status=status.HTTP_201_CREATED)else:return Response({'code': 404, 'msg': res_data.errors})class BookDetailView(GenericAPIView):# 拿到所有的数据 (拿多条数据)queryset = Book.objects.all()# 序列化类serializer_class = BookSerializer# 查询单个数据def get(self, request, pk):# self.get_object() 这个方法就是拿到单个对象res_list = self.get_object()print(res_list)# 剑来res_data = self.serializer_class(instance=res_list)return Response({"code":200,"msg":"查询成功!!!","results": res_data.data})# 子序列化版本def put(self, request, pk):# instance 就是序列化的  res_data就是反序列化的obj = self.get_object()res_data = self.serializer_class(data=request.data, instance=obj)if res_data.is_valid():# 验证过后的数据print(res_data.validated_data)# 保存数据res_data.save()return Response({'code': 200, "msg": res_data.data})else:return Response({'code': 404, 'msg': res_data.errors})def delete(self, request, pk):self.get_object().delete()return Response({'code': 200, 'msg': '删除成功!!!'}, status=status.HTTP_404_NOT_FOUND)

【2】5个视图扩展类 + GenericAPIView + 序列化类 + Response

5个视图扩展类,不是视图类—> 要使用就必须要GenericAPIView 跟 + 视图扩展类

# 5个视图扩展类 + GenericAPIView + 序列化类 + Response# 5个视图扩展类,不是视图类---> 要使用就必须要GenericAPIView 跟 + 视图扩展类
# 他们是可以进行组合的from rest_framework.mixins import CreateModelMixin, RetrieveModelMixin, DestroyModelMixin, ListModelMixin, \UpdateModelMixinclass BookView(GenericAPIView, ListModelMixin, CreateModelMixin):#   继承GenericAPIView的写法# 在类中,写两个类属性:所有数据,序列化类# 拿到所有的数据 (拿多条数据)queryset = Book.objects.all()# 序列化类serializer_class = BookSerializer# 查询所有图书def get(self, request):# # ListModelMixin(查询所有) 的listreturn super().list(request)def post(self, request):# CreateModelMixin(添加) 的createreturn super().create(request)class BookDetailView(GenericAPIView, DestroyModelMixin, RetrieveModelMixin, UpdateModelMixin):# 拿到所有的数据 (拿多条数据)queryset = Book.objects.all()# 序列化类serializer_class = BookSerializer# 查询单个数据def get(self, request, *args, **kwargs):# RetrieveModelMixin(查找单个) retrievereturn super().retrieve(request, *args, **kwargs)# 子序列化版本def put(self, request, *args, **kwargs):# UpdateModelMixin(更改) updatereturn super().update(request, *args, **kwargs)def delete(self, request, *args, **kwargs):# DestroyModelMixin(更改) destroyreturn super().destroy(request, *args, **kwargs)

​ 使用 CreateModelMixinRetrieveModelMixinUpdateModelMixinDestroyModelMixinListModelMixin 这些 mixin 类时,你不需要自己实现这些方法,它们已经为你提供了常见的 CRUD 操作的实现。下面是每个 mixin 类的主要方法和作用:

  1. CreateModelMixin:
    • create(request, *args, **kwargs): 处理 HTTP POST 请求,用于创建新的模型实例。它会从请求数据中反序列化出新的模型实例,并保存到数据库中。
  2. RetrieveModelMixin:
    • retrieve(request, *args, **kwargs): 处理 HTTP GET 请求,用于检索特定的模型实例。它会从 URL 参数中获取主键值,并从数据库中检索对应的模型实例。
  3. UpdateModelMixin:
    • update(request, *args, **kwargs): 处理 HTTP PUT 请求,用于更新现有的模型实例。它会从请求数据中反序列化出更新后的模型实例,并保存到数据库中。
  4. DestroyModelMixin:
    • destroy(request, *args, **kwargs): 处理 HTTP DELETE 请求,用于删除现有的模型实例。它会从 URL 参数中获取主键值,并从数据库中删除对应的模型实例。
  5. ListModelMixin:
    • list(request, *args, **kwargs): 处理 HTTP GET 请求,用于检索多个模型实例。它会从数据库中检索出符合条件的一组模型实例,并将其序列化为 JSON 数据返回给客户端。

这些方法在对应的视图类中被调用,并且已经实现了大部分的逻辑,因此你只需要将 mixin 类与 GenericAPIView 结合使用,并在视图中设置好相应的属性(如 querysetserializer_class),即可完成相应的 CRUD 操作。

【3】9个视图子类

​ 视图子类它们的功能和灵活性。它们提供了不同的操作,允许你对 API 进行增删改查等各种操作,极大地简化了开发过程。你可以根据需要选择合适的视图子类来构建你的 API,从而快速、高效地开发出功能完善的应用程序。

九个视图子类其实就是组合的视图类

  • CreateAPIView
    用于仅创建新模型实例对象的视图
    提供 POST 请求方式
    依赖:GenericAPIView, CreateModelMixin
  • ListAPIView
    用于仅只读模型实例对象集合数据的视图
    提供 GET 请求方式
    依赖:GenericAPIView, ListModelMixin
  • RetrieveAPIView
    用于仅只读单个模型实例对象的视图
    提供 GET 请求方式
    依赖:GenericAPIView, RetrieveModelMixin
  • DestroyAPIView
    用于仅删除单个模型实例对象的视图
    提供 DELETE 请求方式
    依赖:GenericAPIView, DestroyModelMixin
  • UpdateAPIView
    用于仅对已有模型实例进行修改的视图
    提供 PUTPATCH 请求方式
    依赖:GenericAPIView, UpdateModelMixin
  • ListCreateAPIView
    用于对模型实例对象集读取和写入的视图
    提供 GETPOST 请求方式
    依赖:GenericAPIView, ListModelMixin, CreateModelMixin
  • RetrieveUpdateAPIView
    用于对单个模型实例的读取和更新的视图
    提供 GETPUTPATCH 请求方式
    依赖:GenericAPIView, RetrieveModelMixin, UpdateModelMixin
  • RetrieveDestroyAPIView
    用于对单个模型实例的读取和删除的视图
    提供 GETDELETE 请求方式
    依赖:GenericAPIView, RetrieveModelMixin, DestroyModelMixin
  • RetrieveUpdateDestroyAPIView
    用于对单个模型实例的读取、更新和删除的视图
    提供 GETPUTPATCHDELETE 请求方式
    依赖:GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin
# #         CreateAPIView     添加
# #         RetrieveAPIView   查找单个
# #         DestroyAPIView    删除
# #         ListAPIView       查找全部
# #         UpdateAPIView     更改# #         ListCreateAPIView      查找全部并添加
# #         RetrieveDestroyAPIView     查找并删除
# #         RetrieveUpdateDestroyAPIView     查找、更新后删除
# #         RetrieveUpdateAPIView     查找并更新

使用方法

  • urls.py

from django.urls import path
from one.views import ReqsuetView, BookView  ,BookDetailViewurlpatterns = [path('books/', BookView.as_view()),path('books/<int:pk>/', BookDetailView.as_view()),
]
  • 序列化类

万金油

from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from one.models import Book#
class BookSerializer(serializers.ModelSerializer):class Meta:model = Bookfields = '__all__'
from rest_framework.generics import CreateAPIView, RetrieveAPIView, DestroyAPIView, ListAPIView, UpdateAPIView
from rest_framework.generics import ListCreateAPIView,RetrieveDestroyAPIView,RetrieveUpdateDestroyAPIView,RetrieveUpdateAPIViewfrom one.models import Book
from one.serial import BookSerializerclass BookView(ListCreateAPIView):# 查询所有和新增一条接口queryset = Book.objects.all()serializer_class = BookSerializerclass BookDetailView(RetrieveUpdateDestroyAPIView):queryset = Book.objects.all()serializer_class = BookSerializer

上面用到的实际上就是ListCreateAPIView(查询所有创建)RetrieveUpdateDestroyAPIView(查找单个更改删除)

class BookDetailView(RetrieveUpdateDestroyAPIView):queryset = Book.objects.all()serializer_class = BookSerializer# get delete put --> 不改继承的类,限制只能发送get请求# 用到哪个写哪个就行了http_method_names = ["get",]

image-20240415222128527

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

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

相关文章

【C++】二叉搜索树(手撕插入、删除、寻找)

一、什么是二叉搜索树 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值它的左…

hadoop学习---基于Hive的聊天数据分析报表可视化案例

背景介绍&#xff1a; 聊天平台每天都会有大量的用户在线&#xff0c;会出现大量的聊天数据&#xff0c;通过对聊天数据的统计分析&#xff0c;可以更好的对用户构建精准的用户画像&#xff0c;为用户提供更好的服务以及实现高ROI的平台运营推广&#xff0c;给公司的发展决策提…

C++:AVL树

概念&#xff1a; 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查 找元素相当于在顺序表中搜索元素&#xff0c;效率低下。 如图所示&#xff0c;搜索二叉树不能面对右边的树&#xff0c;这种极端的情况&#xf…

利用Github发现优质的学习项目网址

1. 直接搜索&#xff0c;star的数量越多的项目质量越高 2.Github Trending 地址: https://github.com/trending 3. Gitstar Ranking 地址: https://gistar-ranking.com/ 4. Awesome Topic 地址: https://github.com/topics/awesome

[附源码]秦时明月6.2魔改版_搭建架设教程_附GM工具_安卓苹果

本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#xff0c;踩过的坑都给你们填上了 一. 演示视频 秦时明…

【电路笔记】-Twin-T振荡器

Twin-T振荡器 文章目录 Twin-T振荡器1、概述2、Twin-T振荡器3、Twin-T放大4、Twin-T 振荡器示例5、总结Twin-T 振荡器是另一种 RC 振荡器电路,它使用两个并联的 RC 网络来产生单一频率的正弦输出波形。 1、概述 Twin-T 振荡器是另一种类型的 RC 振荡器,它产生正弦波输出,用…

牛客 二叉树 NB1 牛群的最大高度

原题链接 就不采用, 递归的方式来做了, 自己弄个栈来做 用栈来保存路径, curr 表示当前的节点, pre 保留往回走时的上一步 如果是 用递归来做 它的栈链路是这样的, 可以做下参考 黄色表示返回 用栈模拟的话, 不可能模拟得一摸一样, 递归的话一个栈会经过3次, 第三次后就不…

医学论文摘要翻译 中译英哪里比较专业

论文摘要是对论文内容不加注释和评论的简短陈述&#xff0c;需要扼要说明论文的目的、研究方法和最终结论。在发表学术论文时&#xff0c;很多重要刊物会要求作者将文章的摘要翻译成英文。那么&#xff0c;针对医学论文摘要翻译&#xff0c;中译英哪里比较专业&#xff1f; 专…

【C++】详解STL容器之一的 vector

目录 概述 迭代器 数据结构 优点和缺点 接口介绍 begin end rbegin rend resize reseve insert erase 其他一些接口 模拟实现 框架 获取迭代器 深浅拷贝 赋值重载 reseve resize 拷贝构造 构造 析构 insert erase 其他 概述 vector是STL的容器之一。…

连接docker中的MySQL出现2058错误

出错场景&#xff1a;在虚拟机中用docker技术下载最新版本的MySQL&#xff0c;在本地电脑上连接发现出现2058错误。 解决方法&#xff1a; 按照以下步骤 1. 2. ALTER USER root% IDENTIFIED WITH mysql_native_password BY 自己MySQL的密码; 3.成功

redis--安装

简介 官网&#xff1a;RedisInsight - The Best Redis GUI 各个版本官网下载地址&#xff1a;http://download.redis.io/releases/ Redis和Memcached是非关系型数据库也称为NoSQL数据库&#xff0c;MySQL、Mariadb、SQL Server、PostgreSQL Oracle 数据库属于关系型数据 应用…

为什么选择ATECLOUD自动化测试平台?

在当今飞速发展的时代&#xff0c;一切都在不断进步与变革&#xff0c;电测行业也由手动测试逐步转向了自动化测试。但是随着科技的发展&#xff0c;对于产品的测试要求也越来越高&#xff0c;传统的自动化测试系统已经无法满足用户日益增长的测试需求&#xff0c;全新的ATE测试…

优化理论复习——(四)

无约束优化专题&#xff0c;主要使用了序列无约束极小化方法 无约束优化问题相关解法 最优性条件 互补松弛条件 对于一般约束优化问题&#xff1a; 整理一下就是著名的kkt条件&#xff1a; 这里只需要注意一点&#xff0c;那就是互补松弛条件只对不等式约束有限制。 然后是…

在全志H616核桃派开发板上实现超声波传感器测距

前言​ 超声波传感器是一款测量距离的传感器。其原理是利用声波在遇到障碍物反射接收结合声波在空气中传播的速度计算的得出。在测量、避障小车&#xff0c;无人驾驶等领域都有相关应用。 实验目的​ 通过python编程实现超声波传感器测距。 实验讲解​ 下图是一款市面上常…

【智能算法】雪消融优化算法(SAO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2023年&#xff0c;L Deng受到雪升华和融化行为启发&#xff0c;提出了雪消融优化算法&#xff08;Snow Ablation Optimizer, SAO&#xff09;。 2.算法原理 2.1算法思想 SAO模拟了雪的…

C语言,实现数字谱到简谱的转换(二)

C语言&#xff0c;实现数字谱到简谱的转换&#xff08;二&#xff09; 前言&#xff1a;本文初编辑于2024年5月8日 CSDN&#xff1a;https://blog.csdn.net/rvdgdsva 博客园&#xff1a;https://www.cnblogs.com/hassle 前言 结合前文使用 之前的程序默认C调4/4拍&#xff…

探索DeepSeek平台:新一代MoE模型的深度体验

简介 DeepSeek是一个创新的人工智能平台&#xff0c;它最近推出了其最新版本的模型——DeepSeek-V2 MoE&#xff08;Mixture of Experts&#xff09;。这个平台不仅提供了一个交互式的聊天界面&#xff0c;还提供了API接口&#xff0c;让用户可以更深入地体验和利用这一先进的…

使用SpringBoot+Redis做一个排行榜【推荐】

SpringBoot Redis实现排行榜 一、Zset有序集合介绍 Zset是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分( score) ,这个评分( score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的&#xff0c;但是评分可以是重复了…

Service 和 Ingress

文章目录 Service 和 IngressServiceEndpointservice 的定义代理集群外部服务反向代理外部域名Service 常用类型 IngressIngress-nginx安装使用 Service 和 Ingress service 和 ingress 是kubernetes 中用来转发网络请求的两个服务&#xff0c;两个服务用处不同&#xff0c;se…

去哪儿前端一面

谈谈你对mvvm的理解 MVVM分为三个部分:分别是M(Model,模型层 ),V(View,视图层),VM(ViewModel,V与M连接的桥梁,也可以看作为控制器) 1、 M:模型层,主要负责业务数据相关; 2、 V:视图层,顾名思义,负视图相关,细分下来就是html+css层; 3、 VM:V与M沟通的…