聚合查询、分组查询、ORM中如何给表再次添加新的字段、F与Q查询、ORM查询优化、ORM事务操作、ORM常用字段类型、ORM常用字段参数、Ajax、数据编码格式(Content-Type)、ajax携带文件数据

今日内容

聚合查询

在ORM中支持单独使用聚合函数,需要使用aggregate方法。

聚合函数:Max最大、Min最小、Sum总和、Avg平均、count统计

from django.db.models import Max, Min, Sum, Count, Avg
res = models.Book.objects.aggregate(Max('price'), Count('pk'), 最小价格=Min('price'), allPrice=Sum('price'),平均价格=Avg('price'))
print(res)

ps:我们在进行聚合查询的时候,可以给聚合查询的内容命名,如果不主动命名,也会自动用下划线拼接两个字段名,但是这里的命名不建议用中文(虽然能用)


	    from django.db.models import Max, Min, Sum, Avg, Count
	    1.查找所有书籍中价格最高的书籍
	    res = models.Book.objects.aggregate(我是世界上最贵的书=Max('price'))
	    print(res)  # 没有分组之前如果单纯的时候聚合函数 需要关键字aggregate
	
	    2.获取书籍中最贵的 最便宜的 全部需要多少钱 平均一本书多少钱 总共有几本书
	    res1 = models.Book.objects.aggregate(Max('price'), Min('price'), Sum('price'), Avg('price'), Count('pk'))
	    print(res1)
	    
	    		'''通过 别名 = 聚合函数的方法可以取一个别名'''

img

分组查询

小提示:

如果执行orm分组查询报错,并且有关键字sql_mode,需要去mysql配置文件中修改严格模式的配置信息。(Mac不会有)

strict mode
	移除sql_mode中的only_full_group_by

img

# 分组查询
    from django.db.models import Max, Min, Sum, Count, Avg
    # 统计每一本书的作者个数
    res = models.Book.objects.annotate(author_num=Count('authors__pk')).values('title', 'author_num')
    print(res)
    # 统计出每个出版社卖的最便宜的书的价格
    res = models.Publish.objects.annotate(min_price=Min('book__price')).values('name', 'min_price')
    print(res)
    # 统计不止一个作者的图书
    # 1.先统计每本书的作者个数
    res = models.Book.objects.annotate(author_num=Count('authors__pk'))
    print(res)
    # 2.筛选出作者个数大于1的数据
    res = models.Book.objects.annotate(author_num=Count('authors__pk')).filter(author_num__gt=1).values('title',
                                                                                                        'author_num')
    print(res)
    # 查询每个作者出的书的总价格
    """
    models.表名.objects.annotate()                            按照表分组
    models.表名.objects.values('字段名').annotate()            按照values括号内指定的字段分组
    """
    res = models.Author.objects.annotate(总价=Sum('book__price'),count_book=Count('book__pk')).values('name','总价','count_book')
    print(res)

    res = models.Book.objects.values('publish_id').annotate(count_pk=Count('pk')).values('publish_id', 'count_pk')
    print(res)

ORM中如何给表再次添加新的字段

当我们在对数据库使用ORM进行操作的时候,如果出现需要新增字段的情况,在模型层中修改了代码后,进行数据库迁移操作前,需要对新增的字段值进行设置,否则不让进行数据库迁移。

我们可以把字段值设置成一个固定的值,也可以设置字段值可以为空。

首先我们先给我们的书籍表格再添加两条数据(库存以及已销售)
		
	    storage_num = models.IntegerField(verbose_name='库存数')
		sale_num = models.IntegerField(verbose_name='已销售')
		但是出现报错了  
		we can't do that (the database needs something to populate existing rows)
		
		现在这张表已经有数据了 再添加两个新的字段 没有数据值 它的数据值呢 ?
		两种方式 一个默认值 一个退出不执行这个命令再去修改(所以我们得给他加上数据)
		
		storage_num = models.IntegerField(verbose_name='库存数', null=True)
		sale_num = models.IntegerField(verbose_name='已销售', default=1000)

如果不对新的字段值进行设置会出现一下提示:img

F与Q查询

F查询

# 1.查询库存数大于卖出数的书籍
    '''当查询条件不是明确的 也需要从数据库中获取 就需要使用F查询'''
    from django.db.models import F
    res = models.Book.objects.filter(kucun__gt=F('maichu'))
    print(res)
    # 2.将所有书的价格涨800
    models.Book.objects.update(price=F('price') + 800)
    # 3.将所有书的名称后面追加爆款
    from django.db.models.functions import Concat
    from django.db.models import Value
    models.Book.objects.update(title=Concat(F('title'), Value('新款')))

在用ORM进行查询的时候,我们会发现当查询条件不明确的时候不能执行语句,因此需要用到F查询。img

Q查询

 # 查询主键是1或者价格大于2000的书籍
    res = models.Book.objects.filter(pk=1, price__gt=2000)  # 逗号默认是and关系
    from django.db.models import Q
    res = models.Book.objects.filter(Q(pk=1), Q(price__gt=2000))  # 逗号是and
    res = models.Book.objects.filter(Q(pk=1) | Q(price__gt=2000))  # |是or
    res = models.Book.objects.filter(~Q(pk=1) | Q(price__gt=2000))  # ~是not
    print(res.query)

img

一、Q查询进阶操作

这里主要就是让查询数据的时候,可以使用input获取的信息,进行用户交互。

python

from django.db.models import Q
q_obj = Q()  # 1.产生q对象
q_obj.connector = 'or'  # 默认多个条件的连接是and可以修改为or
q_obj.children.append(('pk', 1))  # 2.添加查询条件
q_obj.children.append(('price__gt', 2000))  # 支持添加多个
res = models.Book.objects.filter(q_obj)  # 查询支持直接填写q对象
print(res)

二、ORM查询优化

  • 1.ORM的查询默认都是惰性查询(当我们不执行打印操作的时候,ORM语句不会执行,想要看到这个现象需要打开日志功能,即在配置文件中进行配置)
  • 2.ORM的查询自带分页处理(可以通过日志展示的代码查看,日志返回的sql代码后端会有一个limit)
  • 3.only与defer

only

前置说明

这里需要做一些具体的说明,方便大家理解only和defer。

当我们在Django中执行ORM操作进行数据库查询的时候,其实内部的代码把所有的数据库中的记录,都封装到了ORM操作的对象中去了,因此我们可以通过点的方式或是索引等方式查询到对应的数据。

但是当遇到查询的时候需要查询不在条件中的记录时,就需要执行sql语句进行查询了。

比如我们在查询的时候,需要的结果在外键对应的表中,这时候去外键对应的表中查询数据,就需要执行sql语句进行查询,并且查询一条记录需要执行一次sql语句

而我们的only的作用是把写在括号内的参数中的字段的值封装到对象中,让后续查找的时候 不需要执行sql语句进行查询,加快执行速度。或是起到一个减少代码封装的数据量,加快运行的作用。

而defer则是和only相反,写在括号内的字段值不会被封装到对象中,别的字段反而会被封装到对象中。

only
'''数据对象+含有指定字段对应的数据'''
    # res = models.Book.objects.only('title', 'price')
    # print(res)  # queryset [数据对象、数据对象]
    # for obj in res:
        # print(obj.title)  # 点击括号内填写的字段 不走SQL查询
        # print(obj.price)
        # print(obj.publish_time)  # 可以点击括号内没有的字段获取数据 但是会走SQL查询

defer
    res = models.Book.objects.defer('title', 'price')
    # print(res)  # queryset [数据对象、数据对象]
    for obj in res:
        # print(obj.title)  # 点击括号内填写的字段 走SQL查询
        # print(obj.price)
        print(obj.publish_time)  # 点击括号内没有的字段获取数据 不走SQL查询
  • 4.select_related与prefetch_related

select_related括号内填写一对多、一对一字段 自动连表然后继续数据封装
​ prefetch_related括号内填写一对多、一对一字段 基于子查询然后封装数据

	# res = models.Book.objects.all()
    # for obj in res:
    #     print(obj.publish.name)  # 每次查询都需要走SQL
    # res = models.Book.objects.select_related('authors')  # 先连表后查询封装
    # res1 = models.Author.objects.select_related('author_detail')  # 括号内不支持多对多字段 其他两个都可以
    # print(res1)
    # for obj in res:
    #     print(obj.publish.name)  # 不再走SQL查询

    res = models.Book.objects.prefetch_related('publish')  # 子查询
    for obj in res:
        print(obj.publish.name)

案例截图

img

img

img

img

三、ORM事务操作

"""
1.事务的四大特性(ACID)
	原子性、一致性、隔离性、持久性
2.相关SQL关键字
	start transaction;
	rollback;
	commit;
	savepoint;
3.相关重要概念
	脏读、幻读、不可重复读、MVCC多版本控制...
"""
django orm提供了至少三种开启事务的方式
	方式1:配置文件的数据库相关配置中添加键值对	 
    全局有效
       "ATOMIC_REQUESTS": True
        ps:每次请求所涉及到的orm操作同属于一个事务
	方式2:装饰器							
    局部有效,这个视图函数内的一些orm操作属于一个事务
       from django.db import transaction
       @transaction.atomic
       def index():pass	
 	方式3:with上下文管理					
    局部有效,写在with下方的orm操作属于一个事务
       from django.db import transaction
    	def reg():
    		with transaction.atomic():
             pass

ps:这里的三种方法有个小区别,前面两种方式执行事务,遇到返回值类型不对,orm操作雀食是可以正常执行的,但是with上下文管理的方式操作事务的话,则不行,操作会回退。

四、ORM常用字段类型

名称 含义
AutoField() Int自增列 必须填入参数 primary_key=True 当model中如果没有自增列 则自动会创建一个列名为id的列
CharField() 字符类型 必须提供max_length参数 max_length表示字符长度
IntegerField() 一个整数类型 范围在 -2147483648 to 2147483647 (一般不用它来存手机号(位数也不够) 直接用字符串存)
BigIntegerField() 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807
DateField() 日期字段 日期格式 YYYY-MM-DD 相当于Python中的datetime.date()实例
DateTimeField() 日期时间字段 格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] 相当于Python中的datetime.datetime()实例
DecimalField() 10进制小数 参数 max_digits 小数总长度 decimal_places,小数位长度
EmailField() 字符串类型 Django Admin以及ModelForm中提供验证机制
BooleanField() 布尔值类型 传布尔值存数字0或1
TextField() 文本类型 存储大段文本
FileField() 字符串 路径保存在数据库 文件上传到指定目录 参数 upload_to = " " 上传文件的保存路径 storage = None 存储组件 默认django.core.files.storage.FileSystemStorage
ForeignKey() 外键类型在ORM中用来表示外键关联关系 一般把ForeignKey字段设置在 '一对多’中’多’的一方 ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系
OneToOneField() 一对一字段 通常一对一字段用来扩展已有字段 通俗的说就是一个人的所有信息不是放在一张表里面的,简单的信息一张表,隐私的信息另一张表,之间通过一对一外键关联
ManyToManyField() 简单来说就是在多对多表关系并且这一张多对多的关系表是有Django自动帮你建的情况下 下面的方法才可使用create add set remove clear

ORM还支持用户自定义字段类型,比方说ORM中没有设置char类型的字段,我们可以使用自定义字段来实现他。

	class MyCharField(models.Field):
        def __init__(self, max_length, *args, **kwargs):
            self.max_length = max_length
            super().__init__(max_length=max_length, *args, **kwargs)

        def db_type(self, connection):
            return 'char(%s)' % self.max_length

这里是调用我们定义的字段类型
    class User(models.Model):
        name = models.CharField(max_length=32)
        info = MyCharField(max_length=64)

img

五、ORM常用字段参数

名称 含义
primary_key 主键
verbose_name 注释
max_length 字段长度
max_digits 小数总共多少位
decimal_places 小数点后面的位数
auto_now 每次操作数据自动更新事件
auto_now_add 首次创建自动更新事件后续不自动更新
null 允许字段为空
default 字段默认值
unique 唯一值
db_index 给字段添加索引
choices 当某个字段的可能性能够被列举完全的情况下使用。如:性别、学历、工作状态、...
to 关联表
to_field 关联字段(不写默认关联数据主键)
on_delete 当删除关联表中的数据时,当前表与其关联的行的行为。

需要特别拿出来讲的是关联表时用的字段参数:

on_delete

它的值决定了关联表之前的关联操作行为

这里是代码使用展示

python

def func():
    return 10

class MyModel(models.Model):
    user = models.ForeignKey(
        to="User",
        to_field="id",
        on_delete=models.SET(func)
    )

不同的值对应的功能

python

1、models.CASCADE
    级联操作,当主表中被连接的一条数据删除时,从表中所有与之关联的数据同时被删除
2、models.SET_NULL
    当主表中的一行数据删除时,从表中所有与之关联的数据的相关字段设置为null,此时注意定义外键时,这个字段必须可以允许为空
3、models.PROTECT
    当主表中的一行数据删除时,由于从表中相关字段是受保护的外键,所以都不允许删除
4、models.SET_DEFAULT
    当主表中的一行数据删除时,从表中所有相关的数据的关联字段设置为默认值,此时注意定义外键时,这个外键字段应该有一个默认值
5、models.SET()
    当主表中的一条数据删除时,从表中所有的关联数据字段设置为SET()中设置的值,与models.SET_DEFAULT相似,只不过此时从表中的相关字段不需要设置default参数
6、models.DO_NOTHING
    什么都不做,一切都看数据库级别的约束,注数据库级别的默认约束为RESTRICT,这个约束与django中的models.PROTECT相似

choices

当字段数据的可能性是可以完全列举出来的时候 应该考虑使用该参数

python

		class UserInfo(models.Model):
	    username = models.CharField(max_length=32)
	    gender_choice = (
	        (1, '男性'),
	        (2, '女性'),
	        (3, 'other'),
	    )
	    gender = models.IntegerField(choices=gender_choice)

	    user_obj = models.UserInfo.objects.filter(pk=1).first()
	    print(user_obj.gender)  # 获取的是真实数据
	    print(user_obj.get_gender_display())
	    user_obj1 = models.UserInfo.objects.filter(pk=2).first()
	    user_obj2 = models.UserInfo.objects.filter(pk=3).first()
	    user_obj3 = models.UserInfo.objects.filter(pk=4).first()
	    print(user_obj1.get_gender_display())
	    print(user_obj2.get_gender_display())
	    print(user_obj3.get_gender_display())   # 如果没有则按照真实数据返回

img

六、Ajax

AJAX简介

AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。

AJAX 不是新的编程语言,而是一种使用现有标准的新方法。

AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程)

AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。

  • 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
  • 异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。

ps:ajax不是一门新的技术并且有很多版本 我们目前学习的是jQuery版本(版本无所谓 本质一样就可以)

应用场景

搜索引擎根据用户输入的关键字,自动提示检索关键字。

还有一个很重要的应用场景就是注册时候的用户名的查重。

其实这里就使用了AJAX技术!当文件框发生了输入变化时,使用AJAX技术向服务器发送一个请求,然后服务器会把查询到的结果响应给浏览器,最后再把后端返回的结果展示出来。

  • 整个过程中页面没有刷新,只是刷新页面中的局部位置而已!
  • 当请求发出后,浏览器还可以进行其他操作,无需等待服务器的响应!

img

当输入用户名后,把光标移动到其他表单项上时,浏览器会使用AJAX技术向服务器发出请求,服务器会查询名为lemontree7777777的用户是否存在,最终服务器返回true表示名为lemontree7777777的用户已经存在了,浏览器在得到结果后显示“用户名已被注册!”。

  • 整个过程中页面没有刷新,只是局部刷新了;
  • 在请求发出后,浏览器不用等待服务器响应结果就可以进行其他操作;

AJAX的优点

  • AJAX使用JavaScript技术向服务器发送异步请求;
  • AJAX请求无须刷新整个页面;
  • 因为服务器响应内容不再是整个页面,而是页面中的部分内容,所以AJAX性能高;
  • 两个关键点:1.局部刷新,2.异步请求

语法实现

主体语法

	$.ajax({
        url:'',  // 后端地址 三种填写方式 与form标签的action一致
        type:'post',  // 请求方式 默认也是get
        data:{'v1':v1Val, 'v2':v2Val},  // 发送的数据
        success:function (args) {  // 后端返回结果之后自动触发 args接收后端返回的数据
         	 $('#d3').val(args)
                                }
    })

jQuery发送AJAX请求示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <style>
        .hide {
            display: none;
        }
    </style>
</head>
<body>
<p><input type="text" class="user"><span class="hide" style="color: red">用户名已存在</span></p>

<script src="/static/jquery-3.3.1.min.js"></script>
{#下面这一项是基于jQuery的基础上自动给我们的每一个ajax绑定一个请求头信息,类似于form表单提交post数据必须要有的csrf_token一样#}
{#否则我的Django中间件里面的校验csrf_token那一项会认为你这个请求不是合法的,阻止你的请求#}
<script src="/static/setup_Ajax.js"></script>
<script>
    //给input框绑定一个失去焦点的事件
    $('.user').blur(function () {
        //$.ajax为固定用法,表示启用ajax
        $.ajax({
            //url后面跟的是你这个ajax提交数据的路径,向谁提交,不写就是向当前路径提交
            url:'',
            //type为标定你这个ajax请求的方法
            type:'POST',
            //data后面跟的就是你提交给后端的数据
            data:{'username':$(this).val()},
            //success为回调函数,参数data即后端给你返回的数据
            success:function (data) {
                ret=JSON.parse(data);
                if (ret['flag']){
                    $('p>span').removeClass('hide');
                }
            }
        })
    });
</script>
</body>
</html>

七、数据编码格式(Content-Type)

写在前面

在django中,针对前后端传输数据的编码格式,我们主要研究的是post请求;因为get请求传输的数据往往是直接放在url的后面的!如:

url?username=zhang&passsword=123

研究post请求传输数据的编码格式时,我们需要先了解,可以朝后端发送post请求的方式有哪些??

1.form表单中的method可以发送post请求
2.ajax中type可以指定post请求

前后端传输数据的编码格式有:

1.urlencoded
2.formdata
3.json

针对能够发post请求的form表单和ajax,我们先来研究一下form表单。

form表单

form表单能够指定数据传输的编码格式只有两种,分别是默认urlencoded 和在form表单里指定enctype="multipart/form-data"的formdata格式,无法发送json格式数据

ps:

django针对contentType为urlencoded的编码格式,会自动帮你解析封装到request.POST中,所有我们才能在后端通过request.POST.get的方式进行获取前端传来的数据。

针对contenType为formdata的编码格式,前端传输过来的普通键值对还是会被封装到request.POST中,对于文件则解析封装到request.FILES中!

几种数据编码格式介绍

1.urlencoded
	他是ajax默认的编码格式、form表单默认也是urlencoded
	数据格式  xxx=yyy&uuu=ooo&aaa=kkk
 	django后端会自动处理到request.POST中
    
2.formdata(即multipart/form-data,具体知识点参考request对象获取文件)
	django后端针对普通的键值对还是处理到request.POST中 但是针对文件会处理到request.FILES中
	
    
3.application/json
	form表单不支持 ajax可以
    使用ajax的时候网页返回的数据就只会被ajax接收,我们就不能设置网页跳转了。
    
    
ajax发送json格式数据
			'''模拟Ajax发送数据'''
	
	html 
		   <button id="d1">点击我发送数据</button>
		   <script>
		        $('#d1').click(function () {
		            $.ajax({
		                url:'',
		                type:'post',
		                data:JSON.stringify({'name':'Like', 'pwd':123}),    // 必须json格式。传输数据的时候千万不要骗代码,代码没有这么聪明,如果我们把这里的数据值换成字典就会报错。
		                contentType:'application/json', // 要制定模式 默认Urlencoded
		                success:function (args) {
		                    
		                }
		            })
		        })
		    </script>
		    
	views
			def ajaxjson(request):
		    if request.is_ajax():   # 判断当前是不是ajax请求专门的方法
		        if request.method == 'POST':
		            print(request.POST)     # <QueryDict: {}>
		            print(request.FILES)    # <MultiValueDict: {}>
		            '''Django后端针对json格式数据处理不了 会放在request.body里面'''
		            print(request.body)     # b'{"name":"Like","pwd":123}'
		            '''Django它不会去处理需要我们自己去处理'''
		            json_bytes = request.body
		            import json
		            json_dict = json.loads(json_bytes)	# Json解码
		            print(json_dict, type(json_dict))	
		    return render(request, 'ajaxjson.html')

img

八、ajax携带文件数据

html
<script>
    $('#d3').click(function () {
        // 1.先产生一个FormData对象
        let myFormDataObj = new FormData();
        // 2.往该对象中添加普通数据
        myFormDataObj.append('name', 'jason');
        myFormDataObj.append('age', 18);
        // 3.往该对象中添加文件数据
        myFormDataObj.append('file', $('#d2')[0].files[0])
        // 4.发送ajax请求
        $.ajax({
            url:'',
            type:'post',
            data:myFormDataObj,

            // ajax发送文件固定的两个配置
            contentType:false,
            processData:false,
            success:function (args){
                alert(args)
            }

        })
    })
</script>

views
def ab_ajax_func(request):
    if request.method == 'POST':
        print(request.POST)
        print(request.FILES)
        这里就可以看到文件的数据了
    return render(request, 'abAjaxPage.html')
img
本文转载于网络 如有侵权请联系删除

相关文章

  • MySQL架构备份

    MySQLReplication概述集群的主要类型?高可用集群(HighAvailableCluster,HA)高可用集群是指通过特殊的软件把独立的服务器连接起来,组成一个能够提供故障切换(Fail Over)功能的集群如何衡量高可用?99.53%7天常规系统 99.98%8小时可用系统 99.99%52.6分钟高可用系统 99.999%5.3分钟抗故障系统 99.9999%32秒容错系统复制MySQL常用的集群架构MySQLReplicationMySQLClusterMySQLGroupReplication(MGR)5.7.17MariaDBGaleraClusterKeepalived|HeartBeat||Lvs,Haproxy等技术构建高可用集群什么是MySQLReplication?1、Replication可以实现将数据从一台数据库服务器(master)复制到一台到多台数据库服务器上(slave)2、默认情况下,属于异步复制,所以无需维持长连接复制拓扑:MySQLReplication的原理简单来说,master将数据库的改变写入二进制日志,slave同步这些二进制日志

  • 一中学生发明了成本低廉、意念控制的假肢:造价 2000 元

    当初新冠疫情爆发时,我们中的一些人很幸运,发现自己终于有足够的空闲时间来发展技能,或投身于极度热爱的某个项目。对一些人来说,这可能意味着学习如何烘烤面包,而对于年仅17岁的BenjaminChoi来说,这意味着发明一种可以凭使用者的意念控制的假肢。 据《史密森尼杂志》(SmithsonianMagazine)报道,Choi从小就对意念控制假肢这个想法颇为着迷,他在美国电视新闻杂志节目《60分钟》中生平头一次看到了这样的装置。但这类假肢有一种高大上的感觉,让人很难接近,因为它们需要往大脑植入硬件(因此需要做有风险的手术),才能发挥作用,他很不喜欢。因此,当Choi原本的暑假研究课题因新冠疫情戛然而止时,他便开始着手开发一种更便宜、更安全的解决方案。他利用之前学到的工程和编程知识(这些知识是从学校和StackOverflow网站学到的),设计了一个耐用的假肢,还编写了一种能够将使用者的脑电波转换成具体命令的AI算法。整个系统配有一个比较小的耳机,耳机使用脑电图(EEG)来读取使用者的脑电波。耳机通过蓝牙将读取的这些数据发送到嵌入假肢中的微芯片,Choi的算法在微芯片中破译脑电波,并将其转化

  • DCOS之监控简介(上)

    苏研 DCOS 今天我们本节介绍DCOS监控模块,主要DCOS监控的背景、选型等,接下来,请阅读:DCOS之监控简介(上)现状与需求1.1.业务背景随着DCOS系统的逐渐成熟,DCOS系统平台上线业务逐渐增多,依靠过去人工巡检系统的方式发现系统故障、潜在风险及安全隐患的方式效率越来越低下且运维人员的工作强度及压力也在不断增加,为了提高发现系统故障的及时性、系统维护的专业性、规范化、科学性同时也能把运维人员从重复的工作中解放出来去做更多有意义的事情,因此我们亟需引入平台级的监控手段、工具来协助运维工程师解决当前的问题。建设以应用监控为核心,集成集群监控、主机监控、弹性告警等功能的企业级监控系统,在DCOS系统中采用统一技术手段实现应用的智能运行管理。1.2.主要建设目标与任务为保证自有软件平台运行稳定性,对DCOS系统平台进行自动化监控,合理设置监控粒度及监控对象。尽可能的把潜在问题在萌芽状态解决及消除隐患,以此提高DCOS系统的安全性与稳定性。监控模块的最终目标如下所示:1.及时发现潜在的问题化被动为主动维护;2.为平台性能优化提供直观参考依据;3.提高系统维护的专业性和规范性;4.提

  • php面向对象第七篇 static最详解

    static: 一个一个来吧,好吧。 第一:被static声明的属性可以被实例化调用吗?<?php classpeople { static$name="cyg"; } $people1=newpeople(); $people1->name; ?>复制 第二;被·static声明的方法可以被实例化调用吗?<?php classpeople { staticfunctioneat() { echo"吃饭啦"; } } $people1=newpeople(); $people1->eat(); ?>复制 第三:被static修饰的属性可以被类调用吗?<?php classpeople { static$name='cyg'; } echopeople::$name; ?>复制第四:被static修饰的方法可以被类调用吗?<?php classpeople { staticfunctioneat() {

  • 大话设计模式--第五章 依赖倒置原则

    依赖倒置原则所谓的依赖倒置原则 A.针对接口编程,不要针对实现编程 B.高层模块不应该依赖于底层模块,两个都应该依赖于抽象依赖倒置原则:原话解释的是,抽象不应该依赖于细节,细节应该依赖于抽象.说白了,就是上面那句话。针对接口编程,不要针对实现编程。以计算机为例。无论是主板,还是cpu,内存,硬盘都要针对接口来设计,如果针对实现来设计,内存就要对应到具体的某个主板,那么,就会出现内存坏了需要把主板也换了的尴尬。以前,我们在开发的时候,习惯于将某个业务封装成一个方法.这样达到复用的效果。比如:我们做项目的时候,大多要访问数据,所以我们就把访问数据的代码写成一个函数,每次做新项目是就去调用这些函数。这也就是高层模块依赖底层模块。问题也就出现在这里。我们要做新项目了,发现业务逻辑的高层某块是一样的,但是客户却希望使用不用的数据库或存储信息的方式。这时就麻烦了。我们希望能够再次利用这些高层模块.但是高层模块都是与底层的数据库绑定在一起的。没办法复用这些高层模块,这就非常的糟糕。  就像刚才说的,PC里如果cpu,内存,硬盘都需要依赖具体的主板,主板一块,素有的部件就都没用了,这显然不合理。反过来

  • 手机确诊流行病!辛辛那提大学开发微型设备,结果精确到秒

    大数据文摘出品来源:UCnews编译:张大笔茹使用手机诊断疾病或跟踪病情信息是远程健康监控的终极目标。目前来说,将两者结合在一个设备中是不实际的。科技公司不希望因给手机拟合医疗设备而被监管。辛辛那提大学的工程师们给出了一个最好的方案。加州大学教授ChongAhn设计了一种微型便携式实验室设备,该设备可插入电话,并通过UC开发的自定义应用程序将其自动连接到医生办公室。通过在定制的比信用卡还小的塑料实验芯片UC上滴一滴血或唾液,可以诊断诸如冠状病毒,疟疾,HIV或莱姆病等传染病或监测无数其他种健康状况,如抑郁症和焦虑症等。手机为实验芯片提供电源和测试协议。患者只需将一次性使用的塑料实验芯片放入他的嘴中,然后将其插入盒子中的插槽以检测其唾液。在Nature发表:一种可以在家中使用的快速诊断工具该设备通过自定义的应用程序UC自动将结果及时同步传输给患者的医生。 在最新研究中,安恩和他的研究团队使用智能手机设备测试了疟疾的诊断。该设备还可用于无数种慢性或传染病的在线智能测试,或用于测量与压力有关的激素水平。“全球有超过30亿人拥有手机,”安恩表示,“我们如何使用该技术来测试诸如冠状病毒的传染性疾

  • 前端学习知识体系

    原文地址:一名【合格】前端工程师的自检清单原文作者:ConardLi原文题目是《一名合格前端工程师的自检清单》,我目前的水平离前端工程师还很遥远,所以更愿意把这篇文章当作是对知识体系或者学习路线的总结。同时也是对自己的一个警醒,做好长期学习的准备。PS:表示自己增加的部分一、JavaScript变量和类型1.JavaScript规定了几种数据类型2.JavaScript对象的底层数据结构是什么3.Symbol类型在实际开发中的应用、可手动实现一个简单的Symbol4.基本类型对应的内置对象,以及他们之间的装箱拆箱操作5.理解值类型和引用类型6.赋值、浅拷贝、深拷贝的区别7.null和undefined的区别8.至少可以说出三种判断JavaScript数据类型的方式,以及他们的优缺点,如何准确的判断数组类型9.可能发生隐式类型转换的场景以及转换原则,应如何避免或巧妙应用10.出现小数精度丢失的原因,JavaScript可以存储的最大数字、最大安全数字,JavaScript处理大数字的方法、避免精度丢失的方法原型和原型链1.理解原型设计模式以及JavaScript中的原型规则2.insta

  • 如何在条码软件中制作符合GS1标准的Data 二维码

    dataMatrix是一个矩阵式的二维码,广泛用于商品的防伪、统筹的标识等,有的客户在制作dataMatrix二维码的时候,对二维码的格式有要求,需要将dataMatrix二维码的格式制作成符合GS1标准的,那么,该怎么实现呢?接下来就给大家演示下在条码打印软件中将dataMatrix二维码设置成GS1标准的操作步骤:1.在条码软件中新建标签之后,在软件中绘制一个二维码对象,双击二维码,在图形属性-条码-类型中,选择条码类型为dataMatrix。2.在数据源中,点击”修改”按钮,数据对象类型有手动输入、数据库导入、日期时间、序列生成、随机生成、打印时输入、数据引用、脚本编程、网络通讯等多种类型,这里选择”手动输入”,在下面的状态框中,手动输入你要的数据,点击编辑-确定。3.dataMtrix二维码就制作好了,如果想要制作符合GS1标准的二维码的话,可以双击二维码,在图形属性-条码中,dataMtrix默认的格式是Default,这里把默认格式设置为UccEanGs1,点击确定,符合GS1标准的dataMtrix二维码就制作好了。4.然后可以把制作好的datamatrix的二维码,上传

  • 机器人底层行走技术已趋向成熟 服务机器人产业将迎来蓬勃发展

    随着服务机器人相关技术的不断成熟,“人格化”机器人越来越明显,未来,服务机器人代替人工工作势不可挡,有业内人士预测,在未来的两到三年内,服务机器人产业会得到大规模的爆发,人对机器人的接受程度也会越来越来越高。服务机器人的发展似乎比我们想象的要快不知何时开始,附近的餐厅已经开始使用机器人来充当服务员了,“能说会走”还有类人的模样,吸引了不少小朋友的驻足,不禁感慨,服务机器人的时代就要来了。在2018年的下半年,主打以智慧概念的机器人餐厅一度火爆,他们分别是北京中骏世界城的海底捞智慧餐厅、上海嘉定区的阿里巴巴旗下的盒马鲜生南翔店,以及天津的首家京东X未来餐厅,在这些餐厅中,送餐机器人与顾客们接触紧密,致使这三家餐厅成为服务机器人落地的经典案例。其实,早在两三年前,机器人餐厅就曾火爆一时,当时在北京、上海、广州等地都出现了多家服务机器人餐厅,由机器人代替人工来服务,但由于当时的机器人技术不够成熟,部分的餐厅机器人只能按照既定轨迹运行,并频频发生故障,导致机器人直接被解雇,重新重用了人类员工。经历了两年多的场景磨合,机器人代替人工工作似乎越来越得心应手了,不仅有负责配菜的机械臂,还有将产品配送

  • HTTPS如何保证数据传输安全性

    HTTPS如何保证数据传输安全性HTTP为什么不安全窃听风险篡改风险冒充风险HTTPS如何解决这些安全问题HTTPS非对称加密和对称加密中间人伪造证书浏览器是如何确保CA证书的合法性?用了HTTPS就一定安全吗总结HTTPS如何保证数据传输安全性大家都知道HTTPS比HTTP安全,而HTTP的不安全在哪些方面?以及HTTPS是如何保证数据传输的安全性? HTTP为什么不安全HTTP由于是明文传输,主要存在三大风险:窃听风险、篡改风险、冒充风险。 窃听风险HTTPS在传输数据时是明文方式,数据传输过程中可能会被抓取(抓包),从而信息有泄露风险 篡改风险中间人可以篡改报文内容后再发送给对方,风险极大。 冒充风险比如你以为是在和某宝某东通信,但实际上是在和一个钓鱼网站通信。 HTTPS如何解决这些安全问题为什么用来HTTPS就是安全的HTTPS的底层原理是如何实现的用了HTTPS就一定安全吗HTTPS非对称加密和对称加密知道了HTTP存在的风险后,来看看HTTPS是如何解决这些问题的。本文将从原理上把HTTPS将透彻。 HTTPS协议之所以是安全的是因为HTTPS协议在传输数据时进行了加密,

  • Linux——列出所有打开的端口

    netstat-lntu 复制 #netstat-lntu ActiveInternetconnections(onlyservers) ProtoRecv-QSend-QLocalAddressForeignAddressState tcp000.0.0.0:80890.0.0.0:*LISTEN tcp000.0.0.0:80900.0.0.0:*LISTEN tcp000.0.0.0:80910.0.0.0:*LISTEN tcp000.0.0.0:4430.0.0.0:*LISTEN tcp000.0.0.0:80920.0.0.0:*LISTEN tcp000.0.0.0:80000.0.0.0:*LISTEN tcp000.0.0.0:80010.0.0.0:*LISTEN tcp000.0.0.0:90000.0.0.0:*LISTEN tcp000.0.0.0:63790.0.0.0:*LISTEN tcp000.0.0.0:800.0.0.0:*LISTEN tcp000.0.0.0:220.0.0.0:*LISTEN tcp000.0.0.0:251110.0.0.

  • centos8安装python3.7

    centos8安装python3.7 安装gcc编译器及依赖包 su- #切换到root用户,设置必须在root下完成 gcc--version #查看有没安装gcc yum-yinstallgcc #安装gcc #安装其他依赖包 yum-yinstallzlib-develbzip2-developenssl-develncurses-develsqlite-develreadline-develtk-develgdbm-develdb4-devellibpcap-develxz-devellibffi-devel 复制 下载python3.7.0 #可在https://www.python.org/ftp/python/查询下载地址 wgethttps://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz#下载,root用户默认下载到/root目录,其他用户到/home下面的目录。 复制 解压Python-3.7.0.tgz tar-zxvfPython-3.7.0.tgz 复制 修改编译选项 vimPython-3.7.0/

  • trap命令

    trap命令用于指定在接收到信号后将要采取的动作。常见的用途是在脚本程序被中断时完成清理工作。不过,这次我遇到它,是因为客户you个需求:从终端访问服务器的用户,其登陆服务器后会自动运行某个命令,例如打开应用(命令写在.bashrc等文件中),最后退出,并断开连接;期间是不能允许其使用Ctrl+C等中断退出应用,而回到Shell环境,否则可能会带来安全问题。 当然,解决de方式有很多,如在应用中屏蔽中断信号、使用chroot方式访问等。但这些方法都you一些限制,如需要修改应用,让telnet等支持chroot方式(ssh可支持chroot)等。而使用trap也是一种比较好的解决方法。 一、关于信号   历史上,shell总是用数字来代表信号,而新de脚本程序应该使用信号de名字,它们保存在用#include命令包含进来designal.h头文件中,在使用信号名时需要省略SIG前缀。   kill和trap等都可以看到信号编号及其关联de名称。“信号”是指那些被异步发送到一个程序de事件。默认情况下,它们通常会终止一个程序de运行。 引用   #trap-l   1)SIGHUP&nb

  • drf--ViewSet (指定get关联的函数) 第一波

    ViewSet实现cbv模式指定请求对应函数,函数里面可以放get的多个方法等 urls.py fromdjango.urlsimportpath,re_path urlpatterns=[ #^:匹配字符串开头,#$:匹配字符串末尾, url('^bb/$',viewset.BookView2.as_view({"get":"get_all","post":"add_all"})), re_path("^bb/(?P<pk>.*)$",viewset.BookView2.as_view({"get":"add_all_parm"})), ]复制  views.py fromdjango.httpimportHttpResponse,JsonResponse fromrest_framework.viewsetsimportViewSet classBookView2(ViewSet): #查询数据 defget_all(self,request): returnHttpResponse("获取所有") #添加数据 defadd_all(self,reques

  • mysql 索引异常:

    mysql索引异常: 1通常的异常情况为,使用错索引,导致慢查询。2为什么会使用错索引呢?  因为在执行sql之前,优化器会分析语句,选择不同的索引导致不同的扫描行数,排序等操作,因此存在选错索引的情        况。  优化器会判断使用这个索引需要扫描多少行的数据。3不同的索引会有不同的基数:就是这个索引被多少不同的数据引用(索引的这一列大概有多少数据。)计算方法即使,随机     选取几个数据页,计算出数据量的平均值,然后乘以页数。4在MySQL中,有两种存储索引统计的方式,可以通过设置参数innodb_stats_persistent的值来选择:   设置为on的时候,表示统计信息会持久化存储。这时,默认的N是20,M是10。    设置为off的时候,表示统计信息只存储在内存中。这时,默认的N是8,M是16。5应对索引异常的情况,可以采取下面三种方式应对:  5.1强制使用某个索引。  5.2修改语句引导mysql使用

  • bash编程之循环控制:

    bash编程之循环控制: forvarNameinLIST;do 循环体 done   whileCONDITION;do 循环体 done   untilCONDITION;do 循环体 done   循环控制: continue:提前结束本次循环而开始评估下一轮; break[n]:跳出当前循环   练习:求100以内所有偶数之和; declare-isum=0 foriin{1..100} do  if[$[$i%2]-eq0];then   letsum+=$i  fi done echo$sum   或:             declare-ievenSum=0 declare-ii=1   while[$i-le100];do if[$[$i%2]-eq0];then letevenSum+=$i fi leti++ done echo$evenSum &

  • WSL Linux 的 Windows 子系统[笔记]

    WSL概要 适用于Linux的Windows子系统【WSL】可让开发人员按原样运行GNU/Linux环境-包括大多数命令行工具、实用工具和应用程序-且不会产生传统虚拟机或双启动设置开销。 WSL1架构 ThislayerimplementsLinuxsyscallsontopoftheWindowskernelandiswhatenablesLinuxbinariestorunwithoutmodifcation;whenaLinuxbinaryrunsandmakessyscalls,itistheWSLtranslationlayerthatitisinvokingandthatmakestheconversionintocallstotheWindowskernel. WSL2架构 TebigdifferencescomewiththeuseofwhatthedocumentationreferstoasaLightweightutilityvirtualmachine(seehttps://docs.microsoft.com/en-us/windows/wsl/wsl2-a

  • String 类的常用方法都有那些?

    a、indexOf():返回指定字符的索引。b、charAt():返回指定索引处的字符。 c、replace():字符串替换。 d、trim():去除字符串两端空白。 e、split():分割字符串,返回一个分割后的字符串数组。   f、getBytes():返回字符串的byte 类型数组。 g、length():返回字符串长度。 h、toLowerCase():将字符串转成小写字母。   i、toUpperCase():将字符串转成大写字符。g、substring():截取字符串。 k、equals():字符串比较。

  • 关于input标签只能输入数字

    创建一个input标签添加如下: <input 复制 onkeyup="this.value=this.value.replace(/\D/g,'')" 复制 onafterpaste="this.value=this.value.replace(/\D/g,'')" 复制 type="text"/>复制

  • 团队-团队编程项目作业名称-项目进度

    我们的项目已经完成 但我之前有欠下的作业。现在在补,也特别感谢老师给的机会。

  • ffmpeg视频格式转换

    p.p1{margin:0;text-align:justify;font:12pxHelvetica;color:rgba(69,69,69,1)} span.s1{font:12px"PingFangSC"} ffmpeg格式转换命令 ffmpeg-iinput.mkv-c:vcopy-c:acopyoutput.mp4

相关推荐

推荐阅读