drf之序列化

目录
  • 一、Request类源码分析
    • 总结:
  • 二、 序列化组件介绍
    • 1. 序列化
    • 2. 反序列化
    • 3. 反序列化
  • 三、序列化类的基本使用
      • 查询所有和查询单条(序列化)
      • 总结
  • 4 常用字段类和参数(了解)
      • 4.1 常用字段类
      • 4.2 字段参数(校验数据来用的)
    • 5 反序列化之校验
    • 三层校验
  • 六、 反序列化之保存
    • 新增接口:
    • 修改接口
    • 研究了一个问题
    • 新增数据(反序列化)
    • 修改数据(反序列)

一、Request类源码分析

总结:

1 新的request有个data属性,以后只要是在请求body体中的数据,无论什么编码格式,无论什么请求方式
2 取文件还是从:request.FILES
3 取其他属性,跟之前完全一样 request.method  ....
	-原理是:新的Request重写了__getattr__,通过反射获取老的request中的属性
4 request.GET 现在可以使用 request.query_params
	   @property
        def query_params(self):
            return self._request.GET

**源码中找出来 **

-老的request在新的request._request
-照常理来讲,如果取method,应该request._request.method,但是我现在可以request.method

魔法方法之 getattr, . 拦截,对象.属性 当属性不存在时,会触发 类中 __getattr__的执行
get请求能不能在body体中带数据
-能

二、 序列化组件介绍

1. 序列化

序列化器会把模型对象(queryset,单个对象)转换成字典,经过response以后变成json字符串

2. 反序列化

把客户端发送过来的数据,经过request.data以后变成字典,序列化器可以把字典转成模型

3. 反序列化

完成数据校验功能

三、序列化类的基本使用

1 创建book表模型
写查询所有图书的接口:APIVie+序列化类+Response

from django.db import models

# Create your models here.

class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.IntegerField()

查询所有和查询单条(序列化)

views.py
class BookView(APIView):
def get(self, request):
book_list = Book.objects.all()
# 使用序列化类,完成序列化 两个很重要参数: instance实例,对象 data:数据
# 如果是多条many=True 如果是queryset对象,就要写
# 如果是单个对象 many=False,默认是False
serializer = BookSerializer(instance=book_list, many=True)
# serializer.data # 把qs对象,转成列表套字典 ReturnList
# print(serializer.data)
# print(type(serializer.data))
# return Response(serializer.data)
return Response({'code': 100, 'msg': '成功', 'data': serializer.data})

class BookDetailView(APIView):
def get(self, request, pk):
book = Book.objects.all().get(pk=pk)
serializer = BookSerializer(instance=book)
return Response({'code': 100, 'msg': '成功', 'data': serializer.data})

**urls.py**
```python
urlpatterns = [
    path('books/', views.BookView.as_view()),
    path('books/<int:pk>/', views.BookDetailView.as_view()),
]

序列化类

from rest_framework import serializers

class BookSerializer(serializers.Serializer):
    # 要序列化的字段
    # id = serializers.IntegerField()
    name = serializers.CharField()
    # price = serializers.IntegerField()

总结

序列化类的使用
1 写一个类,继承serializers.Serializer
2 在类中写字段,要序列化的字段
3 在视图类中使用:(多条,单条)
serializer = BookSerializer(instance=book_list, many=True)
serializer = BookSerializer(instance=book)

4 常用字段类和参数(了解)

4.1 常用字段类

字段 字段构造方式
BooleanField BooleanField()
NullBooleanField NullBooleanField()
CharField CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True)
EmailField EmailField(max_length=None, min_length=None, allow_blank=False)
RegexField RegexField(regex, max_length=None, min_length=None, allow_blank=False)
SlugField SlugField(maxlength=50, min_length=None, allow_blank=False) 正则字段,验证正则模式 [a-zA-Z0-9-]+
URLField URLField(max_length=200, min_length=None, allow_blank=False)
UUIDField UUIDField(format=’hex_verbose’) format: 1) 'hex_verbose'"5ce0e9a5-5ffa-654b-cee0-1238041fb31a" 2) 'hex'"5ce0e9a55ffa654bcee01238041fb31a" 3)'int' - 如: "123456789012312313134124512351145145114" 4)'urn' 如: "urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a"
IPAddressField IPAddressField(protocol=’both’, unpack_ipv4=False, **options)
IntegerField IntegerField(max_value=None, min_value=None)
FloatField FloatField(max_value=None, min_value=None)
DecimalField DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None) max_digits: 最多位数 decimal_palces: 小数点位置
DateTimeField DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None)
DateField DateField(format=api_settings.DATE_FORMAT, input_formats=None)
TimeField TimeField(format=api_settings.TIME_FORMAT, input_formats=None)
DurationField DurationField()
ChoiceField ChoiceField(choices) choices与Django的用法相同
MultipleChoiceField MultipleChoiceField(choices)
FileField FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
ImageField ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
ListField ListField(child=, min_length=None, max_length=None)
DictField DictField(child=)
# IntegerField      CharField   DateTimeField  DecimalField

# ListField和DictField---》比较重要,但是后面以案例形式讲

4.2 字段参数(校验数据来用的)

选项参数:(CharField,IntegerField)

参数名称 作用
max_length 最大长度
min_lenght 最小长度
allow_blank 是否允许为空
trim_whitespace 是否截断空白字符
max_value 最小值
min_value 最大值

通用参数:

参数名称 说明
read_only 表明该字段仅用于序列化输出,默认False
write_only 表明该字段仅用于反序列化输入,默认False
required 表明该字段在反序列化时必须输入,默认True
default 反序列化时使用的默认值
allow_null 表明该字段是否允许传入None,默认False
# read_only   write_only   很重要,后面以案例讲

5 反序列化之校验

# 反序列化,有三层校验
    -1 字段自己的(写的字段参数:required   max_length 。。。)
    -2 局部钩子:写在序列化类中的方法,方法名必须是 validate_字段名
    	def validate_name(self, name):
            if 'sb' in name:
                # 不合法,抛异常
                raise ValidationError('书名中不能包含sb')
            else:
                return name
    -3 全局钩子:写在序列化类中的方法 方法名必须是 validate
       def validate(self, attrs):
            price = attrs.get('price')
            name = attrs.get('name')
            if name == price:
                raise ValidationError('价格不能等于书名')
            else:
                return attrs
            
  # 只有三层都通过,在视图类中:
	ser.is_valid():  才是True,才能保存

三层校验

from rest_framework import serializers

from rest_framework.exceptions import ValidationError



class BookSerializer(serializers.Serializer):
    # 要序列化的字段
    id = serializers.IntegerField(required=False)    # required=false表示可以不填
    name = serializers.CharField(allow_blank=True, required=False, max_length=8,
                                 min_length=3, error_messages={'max_length': '太长了'}) # allow_blank 这个字段传了,value值可以为空

    price = serializers.IntegerField(max_value=100, min_value=10, error_messages={'max_value': '必须小于100'})


    # 局部钩子, 给某个字段做个校验
    # 书名中不能包含sb
    # 一定要写成validate_字段名的形式
    def validate_name(self, name):
        if 'sb' in name:
            # 不合法,抛异常
            raise ValidationError('书名中不能包含sb')
        else:
            return name



    def validate_price(self, price):
         if price == 88:
             raise ValidationError('价格不能等于88')
         else:
             return price

    # 全局钩子
    # 价格和书名不能一样 validate
    def validate(self, attrs):
        price = attrs.get('price')
        name = attrs.get('name')
        if name == price:
            raise ValidationError('价格不能等于书名')
        else:
            return attrs

六、 反序列化之保存

新增接口:

-序列化类的对象,实例化的时候:ser = BookSerializer(data=request.data)
-数据校验过后----》调用  序列化类.save()--->但是要在序列化类中重写  create方法
    def create(self, validated_data):
        book=Book.objects.create(**validated_data)
        return book

修改接口

-序列化类的对象,实例化的时候:ser = BookSerializer(instance=book,data=request.data)
-数据校验过后----》调用  序列化类.save()--->但是要在序列化类中重写  update方法
    def update(self, book, validated_data):
        for item in validated_data:  # {"name":"jinping","price":55}
            setattr(book, item, validated_data[item])
        book.save()
        return book

研究了一个问题

在视图类中,无论是保存还是修改,都是调用序列化类.save(),底层实现是根据instance做一个判断

image

新增数据(反序列化)

序列化

    def create(self, validated_data):
        # validated_data校验过后的数据,字典
        book = Book.objects.create(**validated_data)
        return book

views.py

  # 新增
    def post(self, request):
        # 前端会传入数据,request.data--->把这个数据保存到数据库中
        # 借助于序列化类,完成 校验和反序列化
        # data 前端传入的数据 {"name":"三国演义","price":88}
        ser = BookSerializer(data=request.data)
        # 校验数据
        if ser.is_valid():  # 三层:字段自己的校验,局部钩子校验,全局钩子校验
            # 校验通过,保存
            print(ser.validated_data)  # validated_data:校验过后的数据
            # 如果没有save,如何保存,自己做
            # Book.objects.create(**ser.validated_data)
            ser.save()  # 会保存,但是会报错,因为它不知道你要保存到那个表中
            return Response({'code': 100, 'msg': '新增成功'})
        else:
            print(ser.errors)  # 校验失败的错误
            return Response({'code': 101, 'msg': '新增失败', 'errors': ser.errors})

修改数据(反序列)

序列化

    # def update(self, book, validated_data):
    #     # instance 要修改的对象
    #     # validated_data:前端传入,并且校验过后的数据
    #     book.name = validated_data.get('name')
    #     book.price = validated_data.get('price')
    #     # 一定不要忘了
    #     book.save()
    #     return book
	#更高级的写法
    def update(self, book, validated_data):

        for item in validated_data:  # {"name":"jinping","price":55}
            setattr(book, item, validated_data[item])
            # 等同于下面
            # setattr(book,'name','jinping')
            # setattr(book,'price',55)
            # 等同于
            #     book.name = validated_data.get('name')
            #     book.price = validated_data.get('price')
        book.save()
        return book

views.py

    def put(self, request, pk):
        book = Book.objects.get(pk=pk)
        ser = BookSerializer(instance=book, data=request.data)
        if ser.is_valid():
            ser.save() # 也会报错,重写update
            return Response({'code': 100, 'msg': '修改成功'})
        else:
            return Response({'code': 101, 'msg': '修改失败', 'errors': ser.errors})
本文转载于网络 如有侵权请联系删除

相关文章

  • 解决Typecho插件的配置信息没有找到

    避免踩坑入坑Typecho已经一个多月了,在这期间Typecho的插件也开发了两个(其实我现在正在开发第三个,就不告诉你是个采集插件),然后大大小小的坑也踩了不少,其实最深的坑还是启用插件时提示“插件的配置信息没有找到”,这个具体原因就是因为首次启用插件时,在config()里面获取配置信息,这当然是获取不到的,我们复现一个这个错误。先写插件在写一个插件肯定是没那个精力了,我们就稍微改一下官方的HelloWorld插件吧,首先我们先启用报错,在Plugins.php最上面加入下面的代码,这样的话我们就可以看到错误信息了,不然就是ServerErrordefine('__TYPECHO_DEBUG__',true);复制然后我们找到config这个函数,复现一下具体错误,我们加一个获取插件配置的代码,然后保存。$setting=$options=Typecho_Widget::widget('Widget_Options')->plugin('HelloWorld'); echo"<script>al

  • 观察者模式

    当对象间存在一对多关系时,则使用观察者模式(ObserverPattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。介绍意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。如何解决:使用面向对象技术,可以将这种依赖关系弱化。关键代码:在抽象类里有一个ArrayList存放观察者们。应用实例:1、拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。2、西游记里面悟空请求菩萨降服红孩儿,菩萨洒了一地水招来一个老乌龟,这个乌龟就是观察者,他观察菩萨洒水这个动作。优点:1、观察者和被观察者是抽象耦合的。2、建立一套触发机制。缺点:1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,

  • 大数据日志收集框架之Flume实战

    一、环境准备flume官方文档:http://flume.apache.org/documentation.html1、安装包下载jdk1.8:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.htmlflume1.9.0:http://flume.apache.org/download.html2、安装flumetarzxvfapache-flume-1.9.0-bin.tar.gz-C/usr/local/复制ln-sapache-flume-1.9.0-binflume复制3、修改配置文件cd/usr/local/flume/conf复制cpflume-conf.properties.templateflume-conf.properties cpflume-env.ps1.templateflume-env.ps1 cpflume-env.sh.templateflume-env.sh复制 二、配置环境变量1、配置java环境变量2、配置flume环境变量exportFLUME_HOME=

  • 《Hello NumPy》系列-广播操作就看这一篇

    2020,努力做一个无可替代的人! 写在前面的话没想到吧,NumPy还有一小节,请珍惜NumPy最后的美好时光。这一节的内容源自于一个朋友的提问,我在交流群里也分享过,具体问题会在正文中复现,知道你们好奇,往下看就好。害,差点忘了,先回顾下前三节的内容,同学们自行复习:《HelloNumPy》系列-数据类型与创建《HelloNumPy》系列-切片的花式操作《HelloNumPy》系列-运算与函数应用听说抬起头看天眼眶才不会湿?我想试试 正文先来复现一下朋友当时问我的问题:有一个数据a(DataFrame类型、3行4列的数据),数据b(Series类型、0,1,2),比较a和b后输出布尔型数组看一下代码演示#创建DataFrame importpandasaspd df_a=pd.DataFrame(np.arange(12).reshape(3,4)) #输出 0123 00123 14567 2891011 #创建Series importnumpyasnp series_b=pd.Series(np.arange(3)) #输出 00 11 22 dtype:int32复制就这

  • 面向基础软件工程师的算法实践与分析

    转载本文需注明出处:微信公众号EAWorld,违者必究。引言:Google搜索的结果,新浪微博向你展示的话题,淘票票向你推荐的电影,都说明了算法无处不在。而编程从本质上来说就是算法加数据结构,算法是编程思想的核心部分,对于一名基础软件工程师而言,常见的一些算法也是必须重点掌握的内容。而常见的算法以及其应用场景有哪些呢?目录:1.算法概述2.常用算法的理论分析3.常用算法的实际应用1.算法概述算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。1.1算法特征有穷性:算法的有穷性是指算法必须能在执行有限个步骤之后终止;确切性:算法的每一步骤必须有确切的定义;输入项:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件输出项:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;可行性:算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步骤,即每个计算步骤都可以在有限时间内完成

  • Oracle 20c 新特性详解:SQL Macro 宏 SCALAR / TABLE 模式带来的敏捷和便利

    墨墨导读:在Oracle20c中,SQL的宏支持-SQLMacro为SQL开发带来了进一步的敏捷和便利,在这篇文章中,我们来详细了解一下SQLMacro的特性用法。以下是概要介绍:宏的作用在于让SQL获得进一步的概括和抽象能力,允许开发者将复杂的处理逻辑通过宏进行定义,然后在后续程序处理中可以反复引用这一定义。在20c中引入的SQLMacro支持两种宏类型,Scalar和Table类型。SCALR表达式可以用于SELECT列表、WHERE/HAVING、GROUPBY/ORDERBY子句;TABLE表达式可以用于FROM语句。对于SCALAR类型的宏,可以为复杂的SQL提供更灵活的语法来优化执行,这些灵活的方式包括:包和Schema级别的函数,重载,命名参数和默认参数。通过SCALAR宏,可以使可重用的SQL代码对SQLOptimizer透明,这将带来很大的收益,包括:–SQL优化器可以转换代码以有效执行;–PL/SQL内部的查询可以合并到外部查询中;–在PL/SQL和SQL之间没有上下文切换;–在与外部查询相同的快照下执行PL/SQL函数内部的查询;–使用标量宏的WHERE子句谓词可

  • 直播这么火却只有三家公司赚了大钱,2017年还有何看点?

    直播本身就是一个很“热闹”的业务,这个行业也越来越“热闹”。 新年伊始,据《人民日报》报道,国家相关部门近日严查“无证”及违规直播平台,9万个直播间被关闭,超过3万个账号被封禁,还有一些小型直播平台将被清退。与之形成鲜明对比的是,大型直播平台纷纷摩拳擦掌,再战2017。陌陌、YY纷纷举办年终晚会,各家都交出了一份不错的成绩单。微博春节红包活动直播将是重头戏,其余直播平台也会跟进开展“春节红包攻势”。直播行业依然热度不减,成为“尚处寒冬”的互联网行业中的另类。 为什么直播能持续这么火?如果说2015-2016年因为4G网络、移动支付和智能手机这些技术红利,那么2017年直播要吃的红利恐怕就是中国人的“精神消费崛起”了。前几天苹果在中国开始发售AppStore充值卡,背景是2016财年苹果在大中华区(包括港澳台)营收下滑17%,但AppStore销售额增长了90%,手机卖不出去,但手机里面的应用卖得好,从物质到精神消费,是消费升级的重要分支,直播刚好迎合了这一个趋势。 直播的变现之路,究竟是依靠获取注意力进而通过营销变现,还是通过满足用户精神消费需求直接让其掏钱,答案很明朗:瓜分用户的精神

  • JAVAWEB如何集成银联网关支付(模拟环境测试)

    首先登陆网站https://open.unionpay.com这时候你就需要有一个账号了。一、登陆后进入我的产品页面,点击未测试,选择网关测试,开始测试。这里展示的是已经集成完成的页面: 二、点击测试参数 1)分别下载商户私钥证书和银联公钥证书(签名使用),商户私钥证书下载下来后缀是p12,你要手动改成后缀pfx。然后修改对应命名,放置到项目指定读取目录。 2)这里测试时商户号要选择如图涂抹的部分。三、在测试产品里面点击产品名称(茶品详情) 因为我这里已经测试完毕,所以消费交易测试结果已经通过。四、点击右侧交易记录号 这里展示的是交易详情,可以对比自己发起的充值记录是否正确。银联支付DEMO:https://blog.52itstyle.com/archives/326/

  • 腾讯云容器服务查询弹性集群列表api接口

    1.接口描述接口请求域名:tke.tencentcloudapi.com。 查询弹性集群列表 默认接口请求频率限制:50次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:DescribeEKSClusters。 Version 是 String 公共参数,本接口取值:2018-05-25。 Region 是 String 公共参数,详见产品支持的地域列表。 ClusterIds.N 否 ArrayofString 集群ID列表(为空时,表示获取账号下所有集群) Offset 否 Integer 偏移量,默认0 Limit 否 Integer 最大输出条数,默认20 Filters.N 否 ArrayofFilter 过滤条件,当前只支持按照单个条

  • SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and &lt;0.5MB model size

    1.摘要 最近关于深度卷积神经网络的研究都集中在提高准确率上,对于准确率在同一个水平的网络,更小的网络结构至少有三个优点:1.在分布式训练的时候需要更少的跨服务器通信;2.从云端导出新模型到自动驾驶汽车上需要更小的带宽;3.在FPGA等其它硬件内存有限的情况下更容易部署。 作者提出了一个称之为SqueezeNet的网络结构,可以达到和Alex-Net同等水平的准确率但参数量却减少了50多倍。再应用模型压缩技术,作者甚至可以将SqueezeNet压缩到小于0.5MB。 2.相关工作 我们的目标是设计一个网络,参数量尽可能少,同时要保证模型的准确率。 一种方法就是对现有的网络以一种无损的方式进行压缩,已经提出的方法有:对预训练好的模型进行SVD分解,网络剪枝、量化和和霍夫曼编码等。 网络设计方面,随着网络的加深,我们没有办法手工选择每一层网络的卷积核大小,所以提出了Inception模块来结合不同大小的卷积核。而不同层之间的连接,残差网络ResNet和HighwayNetworks则给出了各自的方式,其中残差网络中针对特征图通道数是否相同设计了两种策略。 3.网络结构 3.1.设计

  • SQL server 数据库巡检

    SELECTnameFROMsysobjectswherextype='u'andname<>'XzryGzGrant'ANDnameLIKE'XzryGzGrant2021%' SELECTnameFROMsys.tablesWHERETYPE='U'ANDPATINDEX('%[^0-9][0-9]%',name)>0ORDERBYname --备份表 --SQLServer中,如果目标表存在: insertinto目标表select*from原表; --SQLServer中,,如果目标表不存在: select*into目标表from原表;复制 --查询外键SELECTfk.namefkname,ftable.nameftablename,cn.namefkcol,rtable.nameftablename,'ALTERTABLE'+ftable.name+'DROPconstraint'+fk.name+''FROMsysforeignkeysJOINsysobjectsfkONsysforeignkeys.constid=fk.idJOINsysobjects

  • oracle创建分区表

    创建分区 createtablept_range_list_test( pidnumber(10), pnamevarchar2(30), sexvarchar2(10), create_datedate )partitionbyrange(create_date) subpartitionbylist(sex)( partitionp1valueslessthan(to_date('2020-01-01','YYYY-MM-DD'))tablespacetetstbs1( subpartitionsub1p1values('MAN')tablespacetetstbs1, subpartitionsub2p1values('WOMAN')tablespacetetstbs1, subpartitionsub3p1values(default)tablespacetetstbs1 ), partitionp2valueslessthan(to_date('2021-01-01','YYYY-MM-DD'))tablespacetetstbs2( subpartitionsub1p2va

  • Cmd使用方式--命令行运行程序

    工具用惯却不知道如何去描述什么用,总感觉自己学东西用东西零零散散不系统,心虚!下面总结下自己使用cmd的几种方式。   1=>cmd,command,是window系统下命令提示符,是一种commandlineinterface(命令行界面),可以直接运行,之后可以在里面输入已经配置好的运行程序,如Python。对于有些程序需要以管理员身份运行cmd。右键点击cmd会弹出以管理员身份运行菜单,参考。    2=>有些程序*.exe可能在某个文件夹下,我们可以用cd命令打开该文件夹并运行,如在桌面有个test.exe程序,我们可以按图中命令执行:   3=>我们可以直接到对应文件夹下在地址栏中打开cmd程序,输入cmd并按Enter键就进入对应命令提示符且是在相应文件夹下,可以运行文件夹下相关程序: 4=>有时候我们并没有在系统中配置编译环境,如python2.7版本,我在E:\Anaconda2下有python2.7版本,但我没有配置,而且我写的python2.7脚本在桌面上,我可以将两者拖曳进cmd来运行。随便在哪

  • zabbix监控系统时间的问题

    分类:监控 2013-03-1921:40:11   发现zabbix监控系统时间的一个问题!zabbix监控系统时间用的key是system.localtime,返回当前的系统时间,而配置tigger报警时是用的fuzzytime(N)方法,该方法是将返回的系统时间与监控服务器的时间进行对比,如果大于N,则报警。这样的逻辑就存在两个问题:1.监控服务器并不一定是ntp服务器:这种情况下也就说是系统时间是与非NTP服务器对比的时间。2.取到被监控系统的时间,然后再返回给监控服务器,zabbix由于对数据库的写入量很大,2.0以上版本引入了cache机制,也就是说,系统时间取回来放在cache里放了一会才与本地系统时间进行对比。所以当监控项数量大,或监控出现延时队列的时候。就会产生误报。所以对服务器时间要求比较高的业务不推荐用zabbix自身的system.localtime来对服务器的时间进行监控。解决方案:用zabbix调用nagios-pluins的check_ntp_time进行监控,解决该问题。 ---恢复内容结束---

  • 力扣 题目69- x 的平方根

    题目 题解 二分搜索法但是不同的是我们每次要与中间的平方比较  代码 1#include<iostream> 2usingnamespacestd; 3classSolution{ 4public: 5intmySqrt(intx){ 6if(x==1){ 7return1; 8} 9intmin=0; 10intmax=x; 11//如果max和min交叉 12while(max-min>1) 13{ 14//更新中间 15intmiddle=(min+max)/2; 16//防止int溢出 17if(x/middle<middle){ 18max=middle; 19} 20else 21{ 22min=middle; 23} 24} 25returnmin; 26} 27}; 28 29intmain(){ 30Solutionsol; 31INT_MAX; 32intresult=sol.mySqrt(2147395599); 33cout<<result<<endl; 34 35}复制 ViewCode

  • AD中内电层设置

      用于走线与普铜     内电层分割    

  • 【GPS】Location的四种定位方式说明

    Location的四种定位方式:   GPS定位:     根据设备GPS芯片和GPS卫星实现定位;     GPS定位精度和芯片本身以及实际使用环境有关,一般情况下,GPS定位精度在5m左右。     无线技术公司Broadcom有限公司宣布了这款名为BCM47755的新芯片,现在可是定位精度从5米提高到30厘米。   基站定位:     根据设备获取的基站信息实现定位;     基站定位精度一般不受使用环境影响,主要和基站的覆盖半径有关。     基站定位服务精度目前在200m左右。   WiFi定位:     根据设备获取的WiFi的信息进行定位;     WiFi定位精度一般不受使用环境影响,主要和WiFi半径,密度有关。     WiFi定位精度目前在20m左右。   AGPS定位:     根据网络基站信息和GPS信息对移动台进行定位;     其定位精度上在正常的GPS工作环境下可以达到5m左右,辅助全球卫星定位系统主要是加快TTFF。   代码就是生活的一部分。 坚持每天积累一点,时间久了,你就牛b了!

  • Transportation(最小生成树,虚拟节点)

    题意 有\(N\)个岛屿,现在需要将它们联通起来。 可以选择在岛上建立飞机场,花费为\(X_i\);也可以在岛上建立港口,花费为\(Y_i\);还可以在两个岛屿\(A_i\)和\(B_i\)之间修路,花费为\(Z_i\)。 如果两个岛上都有飞机场,则两者可以联通;如果两个岛上都有港口,则两者可以联通;如果两个岛之间有路,则两者可以联通。 两个岛之间也可以通过其他岛间接联通。 求使得所有岛联通的最小花费是多少。 题目链接:https://atcoder.jp/contests/abc270/tasks/abc270_f 数据范围 \(2\leqN\leq2\times10^5\) \(1\leqM\leq2\times10^5\) \(1\leqX_i,Y_i,Z_i\leq10^9\) 思路 如果只能修路的话,问题就可以转换为一个最小生成树问题。那么加上前两种方式应该怎么处理呢? 考虑建立两个虚拟节点,第一个虚拟节点向每个节点(除了两个虚拟节点)连权值为\(X_i\)的边,第二个虚拟节点向每个节点(除了两个虚拟节点)连权值为\(Y_i\)的边。 如果有至少一个岛需要修建飞机场,则第一个

  • 算法学习(转载)

                        作者 C小加         http://www.cppblog.com/cxiaojia/archive/2011/11/16/rumen.html基本算法贪心算法:贪心算法 作者:独酌逸醉        贪心算法精讲 作者:3522021224递归和分治:递归与分治策略 作者:zhoudaxia图论图的遍历(DFS和BFS):  图的遍历作者:jefferent最小生成树(Prim算法和Kruskal算法): 贪心算法--最小生成树 作者:独酌逸醉Dijkstra算法: 最短路径之Dijk

  • logistic回归

    引用自:http://baike.baidu.com/view/4224660.htm?fr=aladdinlogistic回归又称logistic回归分析,主要在流行病学中应用较多,比较常用的情形是探索某疾病的危险因素,根据危险因素预测某疾病发生的概率,等等。例如,想探讨胃癌发生的危险因素,可以选择两组人群,一组是胃癌组,一组是非胃癌组,两组人群肯定有不同的体征和生活方式等。这里的因变量就是是否胃癌,即“是”或“否”,为两分类变量,自变量就可以包括很多了,例如年龄、性别、饮食习惯、幽门螺杆菌感染等。自变量既可以是连续的,也可以是分类的。通过logistic回归分析,就可以大致了解到底哪些因素是胃癌的危险因素。1详细介绍与多重线性回归的比较logistic回归(Logisticregression)与多重线性回归实际上有很多相同之处,最大的区别就在于他们的因变量不同,其他的基本都差不多,正是因为如此,这两种回归可以归于同一个家族,即广义线性模型(generalizedlinearmodel)。这一家族中的模型形式基本上都差不多,不同的就是因变量不同,如果是连续的,就是多重线性回归,如果

  • HUSTOJ搭建实录

    要做一个MOOC平台,要求有在线编程功能,想偷个懒,于是用了HUSTOJ...... 系统:Ubuntu14.04Kylin 步骤: 一、搭建服务器和相应环境   apache2:   sudoapt-getupdate   sudoapt-getinstallapache2   搭建好后访问127.0.0.1,看见欢迎界面则搭建成功   注意:启动服务时会有“Couldnotreliablydeterminetheserver'sfullyqualifieddomainname,using127.0.0.1forServerName”错误提示      在配置文件/etc/apache2/apache2.conf中加ServerNamelocalhost即可      配置文件中加上AddDefaultCharsetUTF-8支持汉字   mysql:   sudoapt-getinstallmysql-servermysql-client   安装好后修改字符集:sudogedit/etc/mysql/my.cnf   在相应位置添加配置项   [client]   default

相关推荐

推荐阅读