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

Django REST Framework入门之序列化器

文章目录

  • 一、概述
  • 二、安装
  • 三、序列化与反序列化介绍
  • 四、之前常用三种序列化方式
    • json
    • Django内置Serializers模块
    • Django内置JsonResponse模块
  • 五、DRF序列化器
    • 序列化器工作流程
      • 序列化(读数据)
      • 反序列化(写数据)
    • 序列化器常用方法与属性
    • 序列化器参数
    • 扩展验证规则
      • 局部钩子:validate_字段名(self, 字段值)
      • 全局钩子:validate(self, 所有校验的数据字典)
    • 序列化器支持三种类型:
      • Serializer
        • 创建应用myapp
        • 注册myapp
        • 定义数据模型并同步数据库
        • 定义序列化器
        • 视图里使用序列化器
        • 定义路由
        • 启动项目
        • 实现POST方法
        • 获取单个用户
        • 更新用户
        • 删除用户
      • `ModelSerializer[推荐使用]`
        • Meta类常用属性
        • 示例
      • HyperModelSerializer
    • 关联表显示
      • 定义数据模型(myapp/models.py)
      • 定义序列化器(myapp/serializers.py)
      • 定义视图(myapp/views.py)
      • 定义路由(myapp/urls.py)
      • 创建数据库表
      • 启动Django项目
      • 插入测试数据
      • 显示外键对应的详细信息
        • 方法一
        • 方法二
    • 序列化器:SerializerMethodField
      • 示例:给项目API增加一个字段,这个字段数据可从别的表中获取
    • 改变序列化和反序列化的行为
      • 示例1:
      • 示例2:希望给返回的数据添加一个统计应用数量的字段
  • 参考


一、概述

Django REST framework (简称:DRF)是一个强大而灵活的 Web API 工具。遵循RESTFullAPI风格,功能完善。

能简化序列化及开发REST API视图的代码,大大提高REST API的开发速度;提供灵活的路由API,内置了强大的认证和授权机制

二、安装

Django REST framework 最新版使用要求
在这里插入图片描述

pip install djangorestframework

在settings.py文件的INSTALLED_APPS添加rest_framework
在这里插入图片描述

三、序列化与反序列化介绍

序列化:将python对象转json
反序列化:将json转为python对象

四、之前常用三种序列化方式

json

import json
# 序列化
computer = {"主机":5000,"显示器":1000,"鼠标":60,"键盘":150}
json.dumps(computer)
# 反序列化
json.loads(json_obj)

Django内置Serializers模块

是Django内置的一个序列化器,可直接将Python QuerySet对象转为JSON格式,但不支持反序列化

from django.core import serializers
obj = User.objects.all()
data = serializers.serialize('json'
, obj)

Django内置JsonResponse模块

JsonResponse模块自动将Python对象转为JSON对象并响应。

res = {"code": 200, msg: "查询成功"}
return JsonResponse(res)

五、DRF序列化器

DRF中有一个serializers模块专门负责数据序列化,DRF提供的方案更先进、更高级别的序列化方案。

序列化器工作流程

序列化(读数据)

视图里通过ORM从数据库获取数据查询集对象 -> 传入序列化器-> 序列化器将数据进行序列化 -> 调用序列化器的.data获取数据 -> 返回前端

反序列化(写数据)

视图获取前端提交的数据 -> 传入序列化器 -> 调用序列化器的.is_valid方法进行效验 -> 调用序列化器的.save()方法保存数据

序列化器常用方法与属性

  • serializer.is_valid():调用序列化器验证是否通过,传入raise_exception=True可以在验证失败时由DRF响应400异常。
  • serializer.errors:获取反序列化器验证的错误信息
  • serializer.data:获取序列化器返回的数据
  • serializer.save():将验证通过的数据保存到数据库(ORM操作)

序列化器参数

在这里插入图片描述
示例:

class UserSerializer(serializers.Serializer):# 这里的字段必须与使用模型的字段对应id = serializers.IntegerField(read_only=True)name = serializers.CharField(max_length=30,error_messages={ # 设置错误提示"blank": "请输入姓名","required": "该字段必要","max_length": "字符长度不超过30",})

扩展验证规则

如果常用参数无法满足验证要求时,可通过钩子方法扩展验证规则

局部钩子:validate_字段名(self, 字段值)

class UserSerializer(serializers.Serializer):…………# 局部钩子# 姓名不能包含数字def validate_name(self, attrs): # attrs是该字段的值from re import findallif findall('\d+', attrs):raise serializers.ValidationError("姓名不能包含数字")else:return attrs

在视图函数里面通过如下方法查看异常信息

user_ser = UserSerializer(data=request.data)
print(user_ser.errors)

效果如下:
在这里插入图片描述

全局钩子:validate(self, 所有校验的数据字典)

class UserSerializer(serializers.Serializer):…………# 全局钩子def validate(self, attrs):  # attrs是所有字段组成的字典sex = attrs.get("sex")if sex not in ['男','女']:raise serializers.ValidationError("性别只能为男或者女")else:return attrs

序列化器支持三种类型:

• Serializer:对Model(数据模型)进行序列化,需自定义字段映射。
• ModelSerializer:对Model进行序列化,会自动生成字段和验证规则,默认还包含简单的create()和update()方法。
• HyperlinkedModelSerializer:与ModelSerializer类似,只不过使用超链接来表示关系而不是主键ID

Serializer

创建应用myapp
python manage.py startapp myapp
注册myapp

在settings.py文件的INSTALLED_APPS添加myapp
在这里插入图片描述

定义数据模型并同步数据库

myapp/models.py

from django.db import models# Create your models here.
class User(models.Model):name = models.CharField(max_length=30)city = models.CharField(max_length=30)sex = models.CharField(max_length=10)age = models.IntegerField()

python manage.py makemigrations
python manage.py migrate

定义序列化器

创建myapp_api/serializers.py

from rest_framework import serializersclass UserSerializer(serializers.Serializer):# 这里的字段必须与使用模型的字段对应id = serializers.IntegerField()name = serializers.CharField(max_length=30)city = serializers.CharField(max_length=30)sex = serializers.CharField(max_length=10)age = serializers.IntegerField()
视图里使用序列化器
from myapp.models import User   # 导入模型
from .serializers import UserSerializer # 导入序列化器
from rest_framework.views import APIView
from rest_framework.response import Responseclass UserView(APIView):def get(self, requset):queryset = User.objects.all()   # 获取所有用户# 调用序列化器将queryset对象转换为jsonuser_ser = UserSerializer(queryset, many=True)  # 如果序列化多条数据,需要指定many=Truereturn Response(user_ser.data)  # 从.data属性获取序列化结果
定义路由

test01(项目名)/urls.py

from django.contrib import admin
from django.urls import path,re_path,includeurlpatterns = [path('admin/', admin.site.urls),re_path('myapp/', include('myapp.urls')),
]

myapp_api/urls.py

from django.urls import re_path
from myapp import viewsurlpatterns = [re_path('^api/user/$', views.UserView.as_view()),
]
启动项目

访问地址:http://127.0.0.1:8001/myapp/api/user/,可以查看数据
在这里插入图片描述
现在数据库是空的,下面写一个POST方法,来实现数据的创建

实现POST方法

myapp/views.py,在class UserView的get方法下面增加post方法

def post(self, request):user_ser = UserSerializer(data=request.data)    # 调用序列化器将传入的数据反序列化,转换为Python对象if user_ser.is_valid():     # 验证数据格式是否正确user_ser.save()         # 保存数据到数据库msg = '创建用户成功'code = 200else:msg = '数据格式不正确'code = 400res = {'code': code, 'msg': msg}return Response(res)

在myapp/serializers.py下面增加如下方法

from myapp.models import User
def create(self, validated_data):   # validated_data为提交的JSON数据return User.objects.create(**validated_data)

在这里插入图片描述
刷新页面,发现下面多了个输入框,右下角有POST按钮
输入JSON数据,点击POST
在这里插入图片描述
返回创建成功
在这里插入图片描述
再次查看发现多了条数据
在这里插入图片描述
再添加几条数据,结果如下
在这里插入图片描述
上面的方法是查看所有用户,那么如何查看单个用户呢?

获取单个用户

修改myapp/views.py中的get方法为:

def get(self, requset, pk=None):if pk:user_obj = User.objects.get(id=pk)  # 获取单个用户数据user_ser = UserSerializer(user_obj)else:queryset = User.objects.all()   # 获取所有用户# 调用序列化器将queryset对象转换为jsonuser_ser = UserSerializer(queryset, many=True)  # 如果序列化多条数据,需要指定many=Trueres = {'code': 200, 'msg': '获取用户成功', 'data': user_ser.data}return Response(res)  # 从.data属性获取序列化结果

myapp/urls.py增加如下路由

re_path('^api/user/(?P<pk>\d+)/$', views.UserView.as_view()),

在这里插入图片描述
效果
在这里插入图片描述

更新用户

myapp/views.py,在class UserView的get方法下面增加put方法

def put(self, request, pk=None):user_obj = User.objects.get(id=pk)  # 从数据库查找现有的值#调用序列化器传入已有对象和提交的数据user_ser = UserSerializer(instance=user_obj, data=request.data)if user_ser.is_valid():user_ser.save()msg = '更新用户成功'code = 200else:msg = '更新用户失败,数据格式不对'code = 400res = {'code': code, 'msg': msg}return Response(res)

在myapp/serializers.py下面增加如下方法

def update(self, instance, validated_data):     # instance为当前操作的对象,validated_data为提交JSON数据instance.name = validated_data.get('name')instance.city = validated_data.get('city')instance.sex = validated_data.get('sex')instance.age = validated_data.get('age')instance.save()return instance

实际效果
在这里插入图片描述

删除用户

myapp/views.py,在class UserView的get方法下面增加delete方法

def delete(self, request, pk=None):user_obj = User.objects.get(id=pk)try:user_obj.delete()msg = '用户删除成功'code = 200except Exception as e:msg = '用户删除失败'code = 400res = {'code': code, 'msg': msg}return Response(res)

效果
在这里插入图片描述

ModelSerializer[推荐使用]

ModelSerializer 类型不需要自定义字段映射和定义create、update方法,使用起来方便很多!

Meta类常用属性

• fields:显示所有或指定字段
• exclude:排除某个字段,元组格式,不能与fields同时用
• read_only_fields:只读字段,即只用于序列化,不支持修改
• extra_kwargs:添加或修改原有的字段参数,字典格式
• depth:根据关联的数据递归显示,一般是多表

示例
class UserSerializer(serializers.ModelSerializer):class Meta:model = User    # 指定数据模型fields = '__all__'  # 显示所有字段#exclude = ('id', )  # 排除字段read_only_fields = ('id', )extra_kwargs = {'name': {'max_length': 30, 'requierd': True},'city': {'max_length': 10, 'requierd': True},'age': {'max_length': 30, 'requierd': True},'sex': {'mix_value': 16, 'max_value': 100, 'requierd': True},}

HyperModelSerializer

与MedelSerializer使用方法一样。只不过它使用超链接来表示关系而不是主键ID。

# 更改序列化器
class UserSerializer(serializers.HyperlinkedModelSerializer):class Meta:model = Userfields = "__all__"
# 更改视图
user_ser = UserSerializer(queryset, many=True, context={'request': request})
# 更改路由
re_path('^api/user/$', views.UserView.as_view(), name="user-detail"),
re_path('^api/user/(?P<pk>\d+)/$', views.UserView.as_view(), name="user-detail")

关联表显示

例如:应用发布系统项目涉及表
一对多:一个项目有多个应用,一个应用只能属于一个项目
多对多:一个应用部署到多台服务器,一个服务器部署多个应用
在这里插入图片描述

定义数据模型(myapp/models.py)

from django.db import models# 项目表
class Project(models.Model):name = models.CharField(max_length=30)# 应用表
class App(models.Model):name = models.CharField(max_length=30)project = models.ForeignKey(Project, on_delete=models.CASCADE)  # 一对多# 服务器表
class Server(models.Model):hostname = models.CharField(max_length=30)ip = models.GenericIPAddressField()app = models.ManyToManyField(App)   # 多对多

定义序列化器(myapp/serializers.py)

from rest_framework import serializers
from myapp.models import Project, App, Serverclass ProjectSerializer(serializers.ModelSerializer):class Meta:model = Projectfields = "__all__"class AppSerializer(serializers.ModelSerializer):class Meta:model = Appfields = "__all__"class ServerSerializer(serializers.ModelSerializer):class Meta:model = Serverfields = "__all__"

定义视图(myapp/views.py)

from rest_framework.views import APIView
from rest_framework.response import Response
from myapp.models import Project, App, Server
from .serializers import ProjectSerializer, AppSerializer, ServerSerializerclass ProjectView(APIView):def get(self, request):queryset = Project.objects.all()  # 获取所有用户project_ser = ProjectSerializer(queryset, many=True)res = {'code': 200, 'msg': '获取用户成功', 'data': project_ser.data}return Response(res)  # 从.data属性获取序列化结果def post(self, requset):project_ser = ProjectSerializer(data=requset.data)project_ser.is_valid(raise_exception=True)project_ser.save()return Response(data=project_ser.data)class AppView(APIView):def get(self, request):queryset = App.objects.all()  # 获取所有用户app_ser = AppSerializer(queryset, many=True)res = {'code': 200, 'msg': '获取用户成功', 'data': app_ser.data}return Response(res)  # 从.data属性获取序列化结果def post(self, requset):app_ser = AppSerializer(data=requset.data)app_ser.is_valid(raise_exception=True)app_ser.save()return Response(data=app_ser.data)class ServerView(APIView):def get(self, request):queryset = Server.objects.all()  # 获取所有用户server_ser = AppSerializer(queryset, many=True)res = {'code': 200, 'msg': '获取用户成功', 'data': server_ser.data}return Response(res)  # 从.data属性获取序列化结果def post(self, requset):server_ser = ServerSerializer(data=requset.data)server_ser.is_valid(raise_exception=True)server_ser.save()return Response(data=server_ser.data)

定义路由(myapp/urls.py)

from django.urls import re_path
from myapp import viewsurlpatterns = [re_path('^api/project/$', views.ProjectView.as_view()),re_path('^api/app/$', views.AppView.as_view()),re_path('^api/server/$', views.ServerView.as_view()),
]

创建数据库表

python manage.py makemigrations
python manage.py migrate

启动Django项目

插入测试数据

打开python控制台
在这里插入图片描述

#创建项目:
from myapp.models import Project, App, Server
Project.objects.create(name="电商")
Project.objects.create(name="教育")
#创建应用并指定项目:
project_obj = Project.objects.get(name="电商")
App.objects.create(name="portal", project=project_obj)
App.objects.create(name="gateway", project=project_obj)
#创建服务器:
Server.objects.create(hostname="test1", ip="192.168.31.10")
Server.objects.create(hostname="test2", ip="192.168.31.11")
#将应用部署到服务器:
app_obj = App.objects.get(name="portal")
server_obj = Server.objects.get(hostname="test1")
server_obj.app.add(app_obj)

结果如下:
在这里插入图片描述

显示外键对应的详细信息

序列化器返回的是当前模型中的字段,如果字段是外键时,返回的是外键对应id。如下图所示
在这里插入图片描述
有两种解决方法

方法一

定义字段为外键对应序列化类,这种适合针对某个外键字段
例如:

project=ProjectSerializer(read_only=True)	# 一对多
app = AppSerializer(many=True) # 多对多

在这里插入图片描述

方法二

序列化类中Meta类启用depth:深度获取关联表数据,这种所有外键都会显示出来
在这里插入图片描述
效果如下:
在这里插入图片描述

序列化器:SerializerMethodField

DRF序列化器默认仅返回数据模型中已存在资源,如果想新增返回字段或者二次处理,该
如何操作呢?用SerializerMethodFiled

示例:给项目API增加一个字段,这个字段数据可从别的表中获取

class ProjectSerializer(serializers.ModelSerializer):app_count = serializers.SerializerMethodFieldclass Meta:model = Projectfields = "__all__"# get_字段名def get_app_count(self, obj):return len(obj.app_get.all())

改变序列化和反序列化的行为

可以通过重写下面两个方法改变序列化和反序列化的行为:
• to_internal_value():处理反序列化的输入数据,自动转换Python对象,方便处理。
• to_representation():处理序列化数据的输出

示例1:

如果提交API的数据与序列化器要求的格式不符合,序列化器就会出现错误。
这时就可以重写to_internal_value()方法只提取出我们需要的数据
在这里插入图片描述

示例2:希望给返回的数据添加一个统计应用数量的字段

在这里插入图片描述

参考

https://www.aliangedu.cn/course/learn?cid=20&sid=10&pid=2197

相关文章:

Django REST Framework入门之序列化器

文章目录 一、概述二、安装三、序列化与反序列化介绍四、之前常用三种序列化方式jsonDjango内置Serializers模块Django内置JsonResponse模块 五、DRF序列化器序列化器工作流程序列化&#xff08;读数据&#xff09;反序列化&#xff08;写数据&#xff09; 序列化器常用方法与属…...

AI对比:ChatGPT与文心一言的异同与未来

文章目录 &#x1f4d1;前言一、ChatGPT和文心一言概述1.1 ChatGPT1.2 文心一言 二、ChatGPT和文心一言比较2.1 训练数据与知识储备2.2 语义理解与生成能力2.2 应用场景与商业化探索 三、未来展望3.1 模型规模与参数数量不断增加3.2 多模态交互成为主流3.3 知识图谱与大模型的结…...

elasticsearch备份恢复,elasticdump使用

准备环境 1. 将node-v10.23.1-linux-x64.tar.xz上传到服务器/usr/local目录下 2. tar xf node-v10.23.1-linux-x64.tar.xz 3. 将node_modules.tar.gz上传到服务器/usr/local目录 4. tar -zxvf node_modules.tar.gz 5. 设置NODE环境 5.1 vim /etc/profile export NODEJS_…...

【C++干货铺】C++11新特性——右值引用、移动构造、完美转发

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 左值与左值引用 右值与右值引用 左值引用和右值引用的比较 左值引用总结&#xff1a; 右值引用总结&#xff1a; 左值引用的作用和意义 右值引用的使用场景和…...

5G_射频测试_基础概念(二)

定义了测试参考点&#xff0c;不同的RRU类型 C类型传统RRU Conducted and radiated requirement reference points 4.3.1 BS type 1-C&#xff08;传统RRU一般测试点就是连接天线的射频接头&#xff09; 4.3.2 BS type 1-H&#xff08;宏站MassiveMIMO 矩阵天线&#xff…...

【笔记】Helm-3 主题-10 Kubernetes分发指南

Kubernetes分发指南 Helm应该适用于任何 符合标准的Kubernetes版本 &#xff08;无论是否经过 认证 &#xff09;。 https://github.com/cncf/k8s-conformance Certified Kubernetes Software Conformance | CNCF 该文档捕获在特定Kubernetes环境中使用Helm的有关信息。如果…...

ROS第 13 课 TF 坐标系广播与监听的编程 实现

文章目录 第 13 课 TF 坐标系广播与监听的编程 实现1.机器人的坐标变换2.创建功能包3.编程方法3.1 编写广播和监听程序3.2 运行程序 第 13 课 TF 坐标系广播与监听的编程 实现 1.机器人的坐标变换 在进行编程前&#xff0c;先需要了解机器人的坐标变换。这里以运行海龟案例来…...

flask 与小程序 菜品详情和分享功能

mina/pages/food/info.wxml <import src"../../wxParse/wxParse.wxml" /> <view class"container"> <!--商品轮播图--> <view class"swiper-container"><swiper class"swiper_box" autoplay"{{autop…...

C语言通过MSXML6.0读写XML文件(同时支持char[]和wchar_t[]字符数组)

开发环境&#xff1a;Visual Studio 2010 运行环境&#xff1a;Windows XP SP3 第一节 读取XML文件&#xff08;使用wchar_t[]字符数组&#xff09; 读取XML文件可使用IXMLDOMDocument_load函数。 /* 这个程序只能在C编译器下编译成功, 请确保源文件的扩展名为c */ #define …...

在react中说说对受控组件和非受控组件的理解?以及应用场景

在react中说说对受控组件和非受控组件的理解&#xff1f;以及应用场景 回答思路&#xff1a;说说受控组件-->说说非受控组件-->应用场景受控组件&#xff1a;非受控组件应用场景 回答思路&#xff1a;说说受控组件–>说说非受控组件–>应用场景 受控组件&#xff…...

【算法练习Day50】下一个更大元素II接雨水

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 下一个更大元素II接雨水单调…...

深耕文档型数据库12载,SequoiaDB再开源

1月15日&#xff0c;巨杉数据库举行SequoiaDB新特性及开源项目发布活动。本次活动回顾了巨杉数据库深耕JSON文档型数据库12年的发展历程与技术演进&#xff0c;全面解读了SequoiaDB包括在高可用、安全、实时、易用性四个方向的技术特性&#xff0c;宣布了2024年面向技术社区的开…...

json解析

1什么是json JSON(JavaScript Object Notation&#xff0c;JS对象简谱&#xff09;是一种轻量级的数据交换格式。它是基于ECMAScript&#xff08;欧洲计算机协会制定的js规范&#xff09;的一个子集&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰…...

【AI】深度学习在编码中的应用(8)

接上文&#xff0c;本文来梳理和学习智能编码中&#xff0c; 基于残差编码的框架。 智能图像编解码器的成功也推动了智能视频编解码器的发展。传统的视频压缩方法依靠预测编码对运动信息和残差信息分别进行编码。根据时-空域冗余消除方式和阶段不同&#xff0c;现有相关方法可…...

什么是VUE 创建第一个VUE实例

一、什么是Vue 概念&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套 构建用户界面 的 渐进式 框架 Vue2官网&#xff1a;Vue.js 1.什么是构建用户界面 基于数据渲染出用户可以看到的界面 2.什么是渐进式 所谓渐进式就是循序渐进&#xff0c;不一定非得把Vu…...

进程间协同:从进程启动、同步与互斥到进程间通信

进程间协同的目的 在操作系统中&#xff0c;进程是计算机进行任务分配和调度的基本单位。在计算机系统中&#xff0c;有很多任务是无法由单个进程独立完成的&#xff0c;需要多个进程共同参与并协作完成。这就像在现实生活中&#xff0c;有些工作需要一个团队来完成&#xff0…...

【驱动】TI AM437x(内核调试-06):网卡(PHY和MAC)、七层OSI

1、网络基础知识 1.1 七层OSI 第一层:物理层。 1)需求: 两个电脑之间如何进行通信? 具体就是一台发比特流,另一台能够收到。于是就有了物理层:主要是定义设备标准,如网线的额接口类型、管线的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流,就是从1/0…...

Java基础面试题 Object

Java基础面试题 Object 文章目录 Java基础面试题 ObjectObjectObject 类的常见方法有哪些&#xff1f; 和 equals() 的区别hashCode() 有什么用&#xff1f;为什么要有 hashCode&#xff1f;为什么重写 equals() 时必须重写 hashCode() 方法&#xff1f; 文章来自Java Guide 用…...

5G_射频测试_接收机测量(五)

7.2 Reference sensitivity level 接收灵敏度是表示接收机能解析出信号的最小功率&#xff08;和接收机noise figure相关所以RX lineup的大部分工作就是在调整Gain达到最佳NF&#xff09;The throughput shall be ≥ 95%&#xff08;BER&#xff1a;bit error rate 并不是L3ca…...

ESP32-HTTP_webServer库(Arduino)

ESP32-HTTP 介绍 ESP32是一款功能强大的微控制器&#xff0c;具有丰富的网络和通信功能。其中之一就是支持HTTP协议&#xff0c;这使得ESP32可以用于创建Web服务器。 HTTP是什么&#xff1f; HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;&#xff0c;即超文本传…...

无法找到mfc100.dll的解决方法分享,如何快速修复mfc100.dll文件

在日常使用电脑时&#xff0c;我们可能会碰到一些系统错误提示&#xff0c;比如“无法找到mfc100.dll”的信息。这种错误通常会阻碍代码的执行或某些应用程序的启动。为了帮助您解决这一问题&#xff0c;本文将深入探讨其成因&#xff0c;并提供几种不同的mfc100.dll解决方案。…...

[VulnHub靶机渗透]:billu_b0x 快速通关

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步…...

Docker安装开源Blog(Typecho)

前言 首先这个镜像是centos7.9进行安装PHP环境&#xff0c;然后挂载目录去运行的&#xff0c;镜像大概300MB左右&#xff0c;没学过PHP&#xff0c;没办法给Dockerfile文件 参考文章&#xff1a;Docker安装Typecho | D-y Blog感知不强&#xff0c;图一乐https://www.wlul.top…...

【Qt-license】误操作qt下载导致只能安装商业版试用十天,无法安装社区版

背景&#xff1a; 原本是为了学习qml&#xff0c;需要下载一个design studio&#xff0c;而这个需要比较新版的安装程序&#xff0c;但新版的安装程序官方都是online安装。于是从官网找下载链接。毕竟是英文的&#xff0c;又心急&#xff0c;误打误撞中我选择了商业版试用。 其…...

数据操作——缺失值处理

缺失值处理 缺失值的处理思路 如果想探究如何处理无效值, 首先要知道无效值从哪来, 从而分析可能产生的无效值有哪些类型, 在分别去看如何处理无效值 什么是缺失值 一个值本身的含义是这个值不存在则称之为缺失值, 也就是说这个值本身代表着缺失, 或者这个值本身无意义, 比如…...

【刷题笔记4】

动态规划题目汇总 斐波那契数列&#xff1a;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13…… 递归一把解决三类问题&#xff1a;1.数据定义是按照递归的&#xff08;斐波那契数列&#xff09;。2.问题解法是按递归算法实现的。 3.数据…...

cuda二进制文件中到底有些什么

大家好。今天我们来讨论一下&#xff0c;相比gcc编译器编译的二进制elf文件&#xff0c;包含有 cuda kernel 的源文件编译出来的 elf 文件有什么不同呢&#xff1f; 之前研究过一点 tvm。从 BYOC 的框架中可以得知&#xff0c;前端将模型 partition 成 host 和 accel(accel 表…...

怎么从视频中提取动图?一个方法快速提取gif

视频以连续的方式播放一系列图像帧&#xff0c;通过每秒播放的帧数&#xff08;帧率&#xff09;来创做&#xff0c;由于GIF动图则以循环播放一系列静态图像帧的方式展现动画效果。由于视频的优势在于流畅的动画、丰富的细节和长时间播放&#xff0c;因此常用于电影、电视节目、…...

String字符串的比较和hash函数减少哈希冲突

1.为什么比较字符串通过hash值比通过字符串本身效率更高 比较两个字符串的哈希值相对于比较两个字符串本身的效率更高&#xff0c;原因如下&#xff1a; 哈希函数具有快速计算的特性&#xff1a;哈希函数可以将一个字符串转换为一个固定长度的哈希值。这个转换过程通常是非常…...

【数据库原理】(38)数据仓库

数据仓库&#xff08;Data Warehouse, DW&#xff09;是为了满足企业决策分析需求而设计的数据环境&#xff0c;它与传统数据库有明显的不同。 一.数据库仓库概述 定义: 数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合&#xff0c;用于支持企业管理和…...