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

Django REST framework序列化器详解:普通序列化器与模型序列化器的选择与运用

在这里插入图片描述

系列文章目录

  • Django入门全攻略:从零搭建你的第一个Web项目
  • Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作
  • Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解
  • Django ORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践
  • 跨域问题与Django解决方案:深入解析跨域原理、请求处理与CSRF防护
  • Django视图层探索:GET/POST请求处理、参数传递与响应方式详解
  • Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘
  • Django API开发实战:前后端分离、Restful风格与DRF序列化器详解
  • Django REST framework序列化器详解:普通序列化器与模型序列化器的选择与运用
  • 还在写0.0…

文章目录

  • 系列文章目录
  • 前言
  • 一、普通序列化器-Serializer
    • 1. 普通序列化器编写方式
    • 2. 普通序列化器序列化
    • 3. 普通序列化器反序列化创建
    • 4. 普通序列化器反序列化更新
    • 5. 普通序列化器完整代码
  • 二、模型序列化器-ModelSerializer
    • 1. 模型序列化器编写方式
    • 2. 模型序列化器反序列化创建、更新
    • 3. 模型序列化器与普通序列化器的对比


前言

    在 Django REST framework 中,数据序列化至关重要。本文将探讨 普通序列化器模型序列化器,了解它们的基本功能和差异,帮助您根据项目需求选择合适的序列化器。


Response是不能直接返回ORM数据的,所以需要我们进行序列化操作,可以通过手动将其转为字典或JSON,也可以使用DRF所提供的序列化器,一般建议使用序列化器
如果你经常使用的是自己去将数据封装为JSON,那么常见的代码模型就像这样

data = models.objects.all()
json_data = {}
for d in data:json_data['age'] = d.agejson_data['name'] = d.name
return Response(json_data)

随字段越来越多,工作量会越来越大,而且有关于时间(DateTimeField、DateField)等字段类型的序列化直接通过JSON也是不行的,需要自己手动编写JSON的序列化器,非常麻烦,于是乎 DRF 就提供了更为便捷的两种序列化器,普通序列化器模型序列化器


一、普通序列化器-Serializer

1. 普通序列化器编写方式

导包:from rest_framework import serializers

普通序列化器,可以按照给定字段,将所匹配的ORM数据字段转换为JSON数据,不光可以对一条数据,也可以对一个QuerySet所对应的结果集


例如:

用户表 UserModel:

#models.py
from django.db import models# Create your models here.
class UserModel(models.Model):name = models.CharField(max_length=50)phone = models.CharField(max_length=11)password = models.CharField(max_length=30)info = models.CharField(max_length=100, null=True)def __str__(self):return self.nameclass Meta:db_table = 'user'

普通序列化器UserSerializer定义如下:

#userSerializer.py
class UserSerializer(serializers.Serializer):name = serializers.CharField(max_length=50)phone = serializers.CharField(validators=[validators_phone])password = serializers.CharField(max_length=30)info = serializers.CharField(max_length=100,default="默认值")

序列化器的使用分两个阶段:
1、在客户端请求时,使用序列化器可以完成对数据的反序列化(将字典格式的数据转化为模型对象)。
2、在服务器响应时,使用序列化器可以完成对数据的序列化(将模型对象转化为字典格式的数据)。


2. 普通序列化器序列化

序列化就是将ORM数据放入序列化器加工,诞生出JSON数据对象,序列化器对象的data属性即为处理好的 JSON 数据对象

1、单条数据的序列化:

  • 单挑数据的序列化很简单,直接通过序列化器类对象的参数instance传入查询得到的结果即可
#views.py
class UserIdView(APIView):def get(self, request, id):user = UserModel.objects.get(pk=id)usSer = UserSerializer(instance=user)return Response({"message": "get测试成功!", "data": usSer.data})

2、多条数据的序列化:

  • 如果使用像filterall这样的一些ORM方法,获取到的是QuerySet结果集,不是单独数据对象,那么使用序列化器时,需要传入many=True参数,用来表示:传入的不止一条数据。
#views.py
class UserView(APIView):def get(self, request):users = UserModel.objects.all()usSer = UserSerializer(instance=users, many=True)return Response({"message":"get测试成功!","data":usSer.data})

Serializer属性中选项参数

选项参数名称作用
max_length最大长度
min_length最小长度
allow_blank是否允许为空
trim_whitespace是否截断空白字符
max_value最大值
min_value最小值
通用参数名称作用
read_only该字段仅用于序列化输出,需要序列化输出时设置:read_only=True;默认为False
write_only该字段仅用于反序列输入,需要序列化输入时设置:write_only=True;默认为False
required该字段表示在反序列化输入时必须输入
default反序列化时使用的默认值
allow_null表明该字段是否允许传入None,默认False
validators对字段进行校验,定义在字段中
error_message当字段校验不通过时,报error_message的value值
label用于HTML展示API页面时,显示的字段名称
help_text用于HTML展示API页面时,显示的字段帮助提示信息

3. 普通序列化器反序列化创建

反序列化的概念很简单,就是把JSON等数据变为ORM数据对象,甚至是入库或者是修改

DRF要求序列化器必须对数据进行校验,才能获取验证成功的数据或保存成模型类对象


  1. 在操作过程中,反序列化首先需要通过data 传参
  2. 接着调用is_valid进行校验,验证成功返回True,反之返回False
    • 如果校验失败,还可以通过结果的errors 属性返回错误值
    • is_valid调用后方法会进行字段属性(max_value=10)的校验、自定义的校验等等
  3. 对校验过后的对象调用save方法,这个save方法会触发序列化器中的create方法
    • 普通序列化器中create方法默认是没有实现的,需要手动根据模型类进行编写

如果需要自定义校验规则,可以通过validators实现:

#userSerializer.py
from rest_framework import serializers
from app.models import UserModel
import redef validators_phone(values):r_phone = r"^1[3-9]\d{9}$"if re.match(r_phone, values):print("手机号匹配成功!")else:print("手机号匹配失败,抛出异常!")raise serializers.ValidationError("手机号匹配失败!不满足规则!")class UserSerializer(serializers.Serializer):name = serializers.CharField(max_length=50)phone = serializers.CharField(validators=[validators_phone])password = serializers.CharField(max_length=30)info = serializers.CharField(max_length=100,default="默认值")

比如现在,需要提交数据用到创建User的接口,此时可以这么做
为了能够保证数据成功入库,默认的普通序列化器是不具备入库功能的,需要编写create方法

#userSerializer.py
class UserSerializer(serializers.Serializer):name = serializers.CharField(max_length=50)phone = serializers.CharField(validators=[validators_phone])password = serializers.CharField(max_length=30)info = serializers.CharField(max_length=100,default="默认值")def create(self, validated_data):object = UserModel.objects.create(**validated_data)return object#具体来说,**validated_data的作用是:解包字典。
#它将validated_data字典中的键值对解包为一系列的关键字参数。

成功之后,就可以通过像之前一样的数据提交,编写视图完成数据入库,序列化器可以直接处理request所提交的数据data,并且可以剔除在request.data中其他多余的字段,只会处理序列化器里的字段

# views.py
class UserView(APIView):def post(self, request):ser = UserSerializer(data=request.data) # 传参data,进行反序列化if ser.is_valid():print("校验成功!")ser.save()return Response({"message":"[POST]信息添加成功!"})else:print("校验失败!")return Response({"message": ser.errors})

4. 普通序列化器反序列化更新

反序列化经过校验的数据,不光可以用来创建数据,还可以用来更新数据

  • 更新首先需要一个已经存在的数据,所以需要通过instance参数传递已有的一个ORM对象
  • 还需要待更新的新值,那么就需要传data参数
  • 之后同样需要is_valid方法调用,检查即将更新进入的数据是否合法
  • 最终save触发序列化器中的update方法

默认普通序列化器是没有自带对于数据的更新方法的,现在需要在序列化器里创建update方法

# userSerializer.py
class UserSerializer(serializers.Serializer):name = serializers.CharField(max_length=50)phone = serializers.CharField(validators=[validators_phone])password = serializers.CharField(max_length=30)info = serializers.CharField(max_length=100,default="默认值")def update(self, instance, validated_data):# instance 要更新的数据,validated_data 是新数据instance.name = validated_data.get('name', instance.name)instance.phone = validated_data.get('phone', instance.phone)instance.password = validated_data.get('password', instance.password)instance.info = validated_data.get('info', instance.info)instance.save()return instance#获取字段值:
#validated_data.get('name') 尝试从 validated_data 字典中获取键为 'name' 的值。
#validated_data 是由序列化器在验证请求数据后生成的一个字典,它包含了经过验证的字段和它们的值。#默认值机制:
#get 方法有一个可选的第二个参数,即默认值。如果 'name' 这个键不存在于validated_data 中,get 方法将返回这个默认值。
#在这个例子中,如果请求数据中没有包含 'name' 字段,那么默认值就是 instance.name,即当前模型实例的 name 字段的值。

然后通过PUT传递要更新数据的ID,以及更新后的值,来为某条数据更新

class UserIdView(APIView):def put(self, request, id):user = UserModel.objects.get(pk=id)ser = UserSerializer(instance=user, data=request.data)if ser.is_valid():print("校验成功!")ser.save()return Response({"message": "[PUT]信息修改成功!"})else:print("校验失败!")return Response({"message": ser.errors})

5. 普通序列化器完整代码

models.py:

from django.db import models# Create your models here.
class UserModel(models.Model):name = models.CharField(max_length=50)phone = models.CharField(max_length=11)password = models.CharField(max_length=30)info = models.CharField(max_length=100, null=True)def __str__(self):return self.nameclass Meta:db_table = 'user'

userSerializer.py:

from rest_framework import serializers
from app.models import UserModel
import redef validators_phone(values):r_phone = r"^1[3-9]\d{9}$"if re.match(r_phone, values):print("手机号匹配成功!")else:print("手机号匹配失败,抛出异常!")raise serializers.ValidationError("手机号匹配失败!不满足规则!")class UserSerializer(serializers.Serializer):name = serializers.CharField(max_length=50)phone = serializers.CharField(validators=[validators_phone])password = serializers.CharField(max_length=30)info = serializers.CharField(max_length=100,default="默认值")def create(self, validated_data):object = UserModel.objects.create(**validated_data)return objectdef update(self, instance, validated_data):# instance 要更新的数据,validated_data 是新数据instance.name = validated_data.get('name', instance.name)instance.phone = validated_data.get('phone', instance.phone)instance.password = validated_data.get('password', instance.password)instance.info = validated_data.get('info', instance.info)instance.save()return instance

views.py:

from rest_framework.views import APIView
from rest_framework.response import Response
from app.models import UserModel
from app.serializer.userSerializer import UserSerializer
from django.shortcuts import render# Create your views here.class UserView(APIView):def get(self, request):users = UserModel.objects.all()usSer = UserSerializer(instance=users, many=True)return Response({"message":"get测试成功!","data":usSer.data})def post(self, request):ser = UserSerializer(data=request.data) # 传参data,进行反序列化if ser.is_valid():print("校验成功!")ser.save()return Response({"message":"[POST]信息添加成功!"})else:print("校验失败!")return Response({"message": ser.errors})class UserIdView(APIView):def get(self, request, id):user = UserModel.objects.get(pk=id)usSer = UserSerializer(instance=user)return Response({"message": "get测试成功!", "data": usSer.data})def put(self, request, id):user = UserModel.objects.get(pk=id)ser = UserSerializer(instance=user, data=request.data)if ser.is_valid():print("校验成功!")ser.save()return Response({"message": "[PUT]信息修改成功!"})else:print("校验失败!")return Response({"message": ser.errors})

urls.py:

from django.urls import path
from app.views import UserView,UserIdViewurlpatterns = [path('user/', UserView.as_view()),path('user/<int:id>/', UserIdView.as_view()),
]

二、模型序列化器-ModelSerializer

1. 模型序列化器编写方式

之前的普通序列化器,很明显可以感觉到,如果模型类字段少了,还行,但是模型字段越来越多,那么开发者序列化器里所要复刻的字段也要越来越多,很麻烦, 而且还得手动实现updatecreate方法,而且光写了序列化器字段还不行,还得有字段属性

于是乎,有了现在的与模型类关联的序列化器,可以更加方便的进行字段映射以及内置方法的编写


模型类关联序列化器大概总结有如下三个特性,一个缺点:

  • 特点:
    • 基于模型类自动生成一系列字段
    • 自动生成的系列字段,同时还包含uniquemax_length等属性校验
    • 包含默认的createupdate的实现
  • 缺点:
    • 不会自动映射模型类字段的default属性

模型类关联序列化器用的是新的序列化器基类

from rest_framework.serializers import ModelSerializer

用户模型类依旧使用上文中的UserModel.py文件

按照之前的普通序列化写法,你需要同步一个字段,并将字段属性也要记得同步,非常麻烦,但通过与模型类关联的序列化器就很简单了。

  1. 首先通过继承ModelSerializer基类
  2. 通过序列化器元类属性中的model属性关联模型类
  3. 通过序列化器元类属性中的fields属性指明序列化器需要处理的字段
# userModelSerializer.py
from rest_framework import serializers
from app.models import UserModelclass UserModelSerializer(serializers.ModelSerializer):# 不需要再重写 create 和 update 方法了,可查看ModelSerializer源码class Meta:model = UserModelfields = '__all__' # 指明所有模型类字段# exclude = ('password',) # 排除掉的字段# read_only_fields = ('name','info') # 只用于序列化的字段# fields = ('name','phone','password','info')# extra_kwargs = {#     'info':{'min_length':5, 'required':True},# } #修改原有字段的选项参数

模型类关联的序列化器和普通的序列化器使用方法一样,使用序列化器返回当前所有的商品数据,还是像之前一样传入instance参数即可,还要记得由于是多个商品,不是单独数据,要记得加many=True参数

2. 模型序列化器反序列化创建、更新

模型序列化器的创建就更简单了,不需要手动实现create方法,大致流程如下:

  1. 为序列化器绑定数据ser=Serializer(data=request.data)
  2. 校验数据,ser.is_valid()
  3. 存储入库,ser.save()

创建用户接口:

from rest_framework.views import APIView
from rest_framework.response import Response
from app.models import UserModel
from app.serializer.userModelSerializer import UserModelSerializer# Create your views here.class UserView(APIView):def get(self, request):users = UserModel.objects.all()usSer = UserModelSerializer(instance=users, many=True)return Response({"message":"get测试成功!","data":usSer.data})def post(self, request):ser = UserModelSerializer(data=request.data) # 传参data,进行反序列化if ser.is_valid():print("校验成功!")ser.save()return Response({"message":"[POST]信息添加成功!"})else:print("校验失败!")return Response({"message": ser.errors})

注意: 反序列化自动生成的字段属性中,不会包含原始模型类字段中的default字段属性


更细用户信息接口:
更新某一个商品数据,模型序列化器也是自带了update方法

class UserIdView(APIView):def get(self, request, id):user = UserModel.objects.get(pk=id)usSer = UserModelSerializer(instance=user)return Response({"message": "get测试成功!", "data": usSer.data})def put(self, request, id):user = UserModel.objects.get(pk=id)ser = UserModelSerializer(instance=user, data=request.data)if ser.is_valid():print("校验成功!")ser.save()return Response({"message": "[PUT]信息修改成功!"})else:print("校验失败!")return Response({"message": ser.errors})

3. 模型序列化器与普通序列化器的对比

  • 序列化时,将模型类对象传入instance参数
    • 序列化结果使用序列化器对象的data属性获取得到
  • 反序列化创建时,将要被反序列化的数据传入data参数
    • 反序列化一定要记得先使用is_valid校验
  • 反序列化更新时,将要更新的数据对象传入instance参数,更新后的数据传入data参数
  • 模型序列化器普通序列化器更加方便,自动生成序列化映射字段,createupdate方法等
  • 关联外键序列化,字段属性外键为时要记得加many=True

在这里插入图片描述

相关文章:

Django REST framework序列化器详解:普通序列化器与模型序列化器的选择与运用

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…...

红队内网攻防渗透:内网渗透之内网对抗:隧道技术篇防火墙组策略ICMPDNSSMB协议出网判断C2上线解决方案

红队内网攻防渗透 1. 内网隧道技术1.1 学隧道前先搞清楚的知识1.2 常用的隧道技术1.3 判断协议出网的命令1.4 C2上线-开防火墙入站只80&出站只放ICMP1.4.1 icmp隧道上线CS后门1.4.1 icmp隧道上线MSF后门1.5 C2上线-开防火墙入站只80&出站只放DNS1.5.1 DNS隧道上线CS后门…...

【Autoware】Autoware.universe安装过程与问题记录

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Autoware.universe安装过程与问题记录。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下…...

JavaScript的学习之旅之基本数据类型

目录 一、字面量&#xff08;常量&#xff09;和变量 二、标识符 三、数据类型 1.String类型 2.Number类型 四、布尔值类型 五、Null和Undefined类型 一、字面量&#xff08;常量&#xff09;和变量 字面量&#xff1a;不可变的数据&#xff0c;一般位于等式的右边 变量&…...

oracle开放某些视图给特定用户,查询报视图不存在问题

以sysdba身份登录到Oracle数据库。 创建新用户。例如&#xff0c;创建一个名为new_user的用户&#xff0c;密码为password&#xff1a; CREATE USER new_user IDENTIFIED BY password;为新用户分配表空间和临时表空间。例如&#xff0c;将表空间users和临时表空间temp分配给新…...

es 更新索引mapping和setting

1.关闭索引 curl -X POST "localhost:9200/your_index_name/_close"2.修改setting 配置 无法更新一些默认数据,按照需求构建&#xff0c;我这边是构建增加了分词器 "settings": {"index": {"creation_date": "1718850346547…...

广告联盟流量变现app开发

广告联盟流量变现App的开发是一个涉及多个方面的综合性项目。以下是一个简要的开发流程和相关考虑因素&#xff1a; 市场分析与定位&#xff1a; 首先&#xff0c;需要对目标用户群体进行深入研究&#xff0c;了解他们的需求和偏好1。分析当前市场上的竞争对手和流行的广告模式…...

【Python高级编程】pickle`文件处理:序列化与反序列化

使用pickle模块可以在Python中方便地序列化和反序列化Python对象。以下是一个例子&#xff0c;展示了如何处理pickle文件&#xff0c;包括如何保存数据到pickle文件和从pickle文件加载数据。假设我们有一些数据需要保存并在之后加载。 示例代码 保存数据到 pickle 文件 impo…...

如何在 Linux 上安装 Docker Desktop

如何在 Linux 上安装 Docker Desktop Docker 是一个用于开发、部署和运行应用程序的开放平台。Docker Desktop 是 Docker 在 macOS 和 Windows 上的官方客户端&#xff0c;现在也支持 Linux 系统。本文将详细介绍如何在 Linux 上安装 Docker Desktop。 系统要求 在开始安装之…...

勒索病毒猖狂,请提前做好安全防护,德迅卫士保护你的安全

随着互联网的飞速发展&#xff0c;网络安全问题日益凸显。其中&#xff0c;勒索病毒作为一种极具危害性的网络安全威胁&#xff0c;已经引起了广泛关注。为了帮助大家更好地预防和应对勒索病毒攻击&#xff0c;我们特地为您精心准备了这份超实用的勒索病毒自救预防指南。让我们…...

Pycharm怎么默认终端连接远程服务器

因为经常需要从宿舍到学校内通勤&#xff0c;期间所有连接都会中断&#xff0c;所以每次开SSH特别麻烦&#xff0c;每次终端自动切换到本地&#xff1a; 每次都得点一下Start SSH Session 想要默认终端连接远程服务器&#xff0c;需要点File->Setting->Tools->SSH T…...

CTFHUB-SSRF-端口扫描

已经提示我们需要扫描8000~9000的端口 ?urlhttp://127.0.0.1:8000/flag.php 访问用burp抓包爆破 通过Burp扫描8000-9000端口开放的web服务&#xff0c;发现8718开放web服务...

日期工具类:获取 当前周 | 上一周 | 下一周 的第一天(周一)和最后一天(周天)

问题背景 获取 当前周 | 上一周 | 下一周 的第一天(周一)和最后一天(周天)。 例如: 输入:2024-6-21, current 输出:{"firstDay": "2024-6-17","lastDay": "2024-6-23"}输入:2024-6-21, last 输出:{"firstDay": …...

大数据学习-Hadoop

介绍 是 Apache 的顶级开源项目&#xff0c;一个分布式框架&#xff0c;主要功能&#xff1a; 分布式大数据存储——HDFS 组件分布式大数据计算——MapReduce 组件分布式资源调度——YARN 组件 可以通过它来构建集群&#xff0c;完成大数据的存储和计算 学习起来相对简单&…...

visualbox搭建linux环境双网卡配置

文章目录 1. 双网卡模式简介2. 网络模式配置2.1 virtualBox说明2.2 host-only网络模式配置2.3 NAT网络模式配置 3. 虚拟主机网络设置3.1 网卡一设置3.2 网卡二设置 4. 网卡配置5. ssh访问 本篇的目的是为了搭建本地的linux测试环境用。 1. 双网卡模式简介 双网卡网络模式简介 …...

一分钟了解Galaxybase银河图数据库先锋版升级功能!

Galaxybase 银河图数据库是一款创邻科技自主研发的商用图数据库&#xff0c;具有高性能、高可用、企业级安全等特性&#xff0c;支持大规模数据查询实时返回&#xff0c;快速挖掘关联关系&#xff0c;发现深层商业洞见&#xff0c;可广泛应用于金融、能源、电信、政企等行业中的…...

C++并发之协程实例(二)(计算斐波那契序列)

目录 1 协程2 实例-计算斐波那契序列2.1 斐波那契序列2.2 代码 3 运行 1 协程 协程(Coroutines)是一个可以挂起执行以便稍后恢复的函数。协程是无堆栈的&#xff1a;它们通过返回到调用方来暂停执行&#xff0c;并且恢复执行所需的数据与堆栈分开存储。这允许异步执行的顺序代码…...

云邮件推送服务如何配置?有哪些优势特点?

云邮件推送的性能怎么优化&#xff1f;如何选择邮件推送服务&#xff1f; 云邮件推送服务是一种基于云计算的邮件发送解决方案&#xff0c;能够帮助企业和个人高效地发送大规模邮件。AokSend将详细介绍如何配置云邮件推送服务&#xff0c;以便你能够充分利用其优势。 云邮件推…...

QT 数值型坐标轴有那些?(QValueAxis)

在Qt中&#xff0c;QValueAxis类用于表示数值型坐标轴&#xff0c;它本身没有直接的子类&#xff0c;但它是从QAbstractAxis这个抽象类继承而来的。QAbstractAxis是定义坐标轴属性和行为的基类&#xff0c;而QValueAxis则在此基础上提供了针对数值数据的具体实现。 Qt的图表模…...

《数字图像处理-OpenCV/Python》第16章:图像的特征描述

《数字图像处理-OpenCV/Python》第16章&#xff1a;图像的特征描述 本书京东 优惠购书链接 https://item.jd.com/14098452.html 本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html 第16章&#xff1a;图像的特征描述 特征通常是针对图像中的目标或…...

React的服务器端渲染(SSR)和客户端渲染(CSR)有什么区别?

React的服务器端渲染&#xff08;SSR&#xff09;和客户端渲染&#xff08;CSR&#xff09;是两种不同的页面渲染方式&#xff0c;它们各自有不同的特点和适用场景&#xff1a; 服务器端渲染&#xff08;SSR&#xff09; 页面渲染: 页面在服务器上生成&#xff0c;然后将完整的…...

安全生产第一位,靠谱的漏油监测系统有哪些?

漏油监测系统&#xff0c;一般是由漏油绳、漏油控制器、监控云平台组成&#xff0c;用于实时检测油库、油罐、加油站、输油管道、油类化工厂等场所是否发生漏油事故。在这些地方一旦发生漏油&#xff0c;就极可能引发爆炸&#xff0c;损害到人员及财产安全。而一套靠谱的漏油监…...

基于C#、Visual Studio 2017以及.NET Framework 4.5的Log4Net使用教程

在使用Log4Net记录日志时&#xff0c;以下是一个基于C#、Visual Studio 2017以及.NET Framework 4.5的详细步骤教程。这个教程适合初学者&#xff0c;会从添加Log4Net库、配置日志、编写日志记录代码等方面进行说明。 步骤1&#xff1a;安装Log4Net 通过NuGet安装 打开您的Vi…...

C# —— 构造函数

什么是构造函数 构造函数: 一般在函数为类的属性初始值的作用&#xff0c;构造函数的名称类名 在类里面定义构造函数 方法名和类名同名 不能带返回值类型 void/非void 不能有 // 创建一个构造函数 class People {public string Name { get; set; }public int Age { get; set;…...

HTML5的新属性

pattern&#xff1a;用于指定输入字段的正则表达式模式。在提交表单前&#xff0c;输入将验证是否符合指定的模式。 pattern 属性是 HTML5 中用于表单验证的一个属性&#xff0c;它用于指定一个正则表达式&#xff0c;以验证输入字段中的值是否符合特定的模式。该属性通常与 &l…...

[C语言] 常用排序算法

冒泡排序 思路&#xff1a; 从小到大&#xff0c;找到集合中最小的放在最左边&#xff0c;在剩下的集合中找到最小的放在最左边以此类推。如何找到最小的&#xff1f;&#xff08;假定左边第一个数就是最小的&#xff0c;让它依次和它右边的比较&#xff0c;如果右边的比它还小…...

【前端vue3】TypeScrip-interface(接口)和对象类型

对象类型 定义对象需要用到interface&#xff08;接口&#xff09;&#xff0c;主要用来约束数据的类型满足格式 定义方式如下&#xff1a; interface Person {name: string;age: number; }如对象中与接口中的属性不一致会报错&#xff0c;必须保持一致 例如如下&#xff1a…...

神经网络 torch.nn---nn.RNN()

torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io) RNN — PyTorch 2.3 documentation torch.nn---nn.RNN() nn.RNN(input_sizeinput_x,hidden_sizehidden_num,num_layers1,nonlinearitytanh, #默认tanhbiasTrue, #默认是Truebatch_firstFalse,dropout0,bidirection…...

RocketMQ-记一次生产者发送消息存在超时异常

目录 1、背景说明 2、排查 2.1、防火墙 2.2、超时时间设置 2.3、服务器资源检查 2.3.1、内存、CPU等 2.3.2、磁盘空间 ​编辑 2.3.3、检查文件描述符 2.3.4、swap区 3、增加swap空间 3.1、创建目录 3.2、格式化 3.3、启动swap 3.4、查看效果 1、背景说明 在一次…...

ls命令的参数选项

ls命令的参数的作用 可以指定要查看的文件夹&#xff08;目录&#xff09;的内容&#xff0c;如果不指定参数&#xff0c;就查看当前工作目录的内容。ls 命令的选项 常用语法&#xff1a;ls [-a -l -h] [linux路径] -a 选项表示 all &#xff0c;即列出全部内容&#xff0c;包括…...

wordpress 中文博客主题/seo优化包括哪些内容

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于web网页的校园二手书籍交易系统&#xff0c;整个网站项目使用了B/S架构&#xff0c;基于python的Django框架下开发&#xff1b;用户通过登录网站&#xff0c;查询二手交易商品&#xff0c;购买二手交易网…...

网络推广服务如何退费/东莞关键词排名快速优化

1.map标签 带有可点击区域的图像映射&#xff0c;一张图片可以有多个不同可点击区域&#xff0c;&#xff0c;每个区域点击后跳转页面不同 2.示例 <img src"./images/345.jpg" alt"" srcset"" usemap"#mp"><map name"mp…...

javaweb可以做网站吗/品牌营销策划方案怎么做

1、打开激活窗口 2、选择 Activate new license with License server &#xff08;用license server 激活&#xff09; 3、在 License sever address 处填入 https://jetlicense.nss.im/ 4、点击 Activate 进行认证 还有一种方法比较麻烦&#xff0c;就不提及了...

做外贸用什么视频网站/网络优化大师app

概述 向指定的表格中插入一条新数据。 当表格中已存在相同Key的数据时&#xff0c;数据将插入失败。 示例代码 同步调用参见章节&#xff1a;[Generic表]插入数据示例代码。 异步调用参见章节&#xff1a;异步调用接口示例代码。 Request对象方法说明 注&#xff1a;如有…...

购买域名后怎么做网站/百度下载app下载

全部下一个。我试图为python安装cv2模块&#xff0c;但失败了。我正在使用Python3.6(64位)我在命令中键入了以下命令&#xff1a;C:\Users\leahj>C:\Users\leahj\AppData\Local\Programs\Python\Python36\Scripts\pip3 install cv2Collecting cv2Could not find a version t…...

中铁建设集团个人门户网/郑州seo教程

Android自定义View的构造函数自定义View是Android中一个常见的需求&#xff0c;每个自定义的View都需要实现三个基本的构造函数&#xff0c;而这三个构造函数又有两种常见的写法。第一种每个构造函数分别调用基类的构造函数&#xff0c;再调用一个公共的初始化方法做额外初始化…...