认识 Django REST framework 框架
Django REST framework 框架是一个用于构建Web API 的强大而又灵活的工具。
通常简称为DRF框架 或 REST framework。
特点:
提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;
提供了丰富的类视图、Mixin扩展类,简化视图的编写;
丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;
多种身份认证和权限认证方式的支持;
内置了限流系统;
直观的 API web 界面;
可扩展性,插件丰富
Django**请求的生命周期**
1、Django的中间件
Django的中间件就是一个类,分别是process_request,process_respone,process_view,process_exception,process_render_template。
以上方法的返回值可以是None或一个Httpresponse 对象,如果是None,则继续按照django定义的规则向后继续执行,如果是Httpresponse对象,则直接将该对象返回给用户。
Process_request有一个参数,就是request,这个request和视图函数中的request是一样的,他的返回值可以是None也可以是httpresponse对象,返回值是none的话,按照正常流程继续走,交给下一个中间件处理,如果是httpresponse对象,django将不执行视图函数,而将相应对象返回给浏览器。(总结中间件的process_request方法是在执行视图函数之前执行的、2.当配置多个中间件时,会按照Middleware中的注册顺序,也就是列表的索引值,从前到后依次执行。3.不同中间件之间传递的request都是同一个对象”
Process_response
他有两个参数,一个是request,一个是response,request就是上述例子中的一样的对象,reponse是视图函数返回的httpresponse对象。该方法的返回值也必须是Httpresponse对象。
Process_view
Process_view(self.view_func.view_args,view_kwargs)
该方法有四个参数:
Request是httprequest对象。
View_func是django即将使用的视图函数(它是实际的函数对象,而不是函数的名称最为字符串)
View_args是将传递给视图的位置参数的列表
View_kwargs是将传递给视图的关键字参数的字典。View_args和view_kwargs都不包含第一个参数视图(request)
Django会在调用视图函数之前调用process_view方法。
Process_exception
该方法两个参数:一个Httprequest对象,一个exception是视图函数异常产生的Exception对象
该方法只有在视图函数出现异常才执行,他返回的值可以是一个none也可以是一个httpresponse对象,如果是httpresponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常,如果返回一个None,则交给下一个中间件的process_exception方法来处理异常,她得执行顺序也是按照中间件注册顺序的倒叙值行的。
Middleware 配置项是一个列表,列表是一个个字符串,这些字符串儿其实就是一个个类,也就是一个个中间件
中间件的应用场景
做ip限制
放在中间件类的列表中,阻止了某些ip的访问
2、URL访问过滤
如果用户访问的是login视图
如果访问其他视图(需要检测是不是有session已经有了放行,没有返回login),这样就省在多个视图函数上写装饰器
3、缓存
客户端请求来了,中间件去缓存看看有没有数据,有直接返回给用户,没有再去逻辑层执行视图函数
注意:项目目录下MIDDLEWARE中'django.middleware.csrf.CsrfViewMiddleware',为用户实现防止跨站请求伪造的功能,在之前我们都是将它注释掉的,因为我们如果不注释掉在表单提交的时候就会报forbidden的错误,但是如果我们又要用到防止跨域请求,又不要报错我们只需要在表单<from>标签中加入{% csrf_token %}即可解决这个问题。
流程控制语句+
有if、for、while、break、continue
If
Num=int(input(“pleaseinputanumber……”)# 提醒用户输入
Ifnum==1:#注意:最后elif
Print(”yournumis”,1)
Elifnum==2:#注意:elif
Print(yournumis”,2)
Elif:
Print(“hellopython“)
#输入:分别输入 1 2 5
#输出:分别输出1 2 hello Python
序列化 serialization
将程序中的一个数据结构类型转化为其他格式(字典,json,xml等),例如将django中的对象转化为json字符串,这个转换过程我们称为序列化
Django REST farmework 可以帮助我们简化上述两步分的代码编写,大大提高rest api的开发速度。
优化mysql数据库的8个方法
1、创建索引 2、复合索引 3、索引不会包含null值的列(注意:只要列中包含有null值都将不会包含在所有中,复合索引中只要有一列含有null值,那么这一列对于复合索引就是无效的,所以设计数据库时不要让字段的默认值为null) 4、使用短索引 5、排序的索引问题 6、like语句操作 7、不要在列上运行运算 8、不使用not in <> 操作
mysql的复制原理及负载均衡
mysql主从复制工作原理
1、在主库上把数据更高记录到二进制日志
2、从库将主库的日志复制到自己的中继日志
3、从库读取中继日志事件(增 删 改),将其重放到从库数据中
mysql复制的优点:1,如果主库出现问题,可以快速切换到从库提供服务
2、可以在从库执行查询操作,降低主库的访问压力
3、可以在从库进行备份,以免备份期间影响主库的服务
注意:
由于mysql实现的异步复制,所以主库和从库之间存在一定差异,在从库执行查询操作需要考虑这些数据的差异,一般只有更新不频繁和对实时性要求不高的数据可以通过从库插叙,实行要求高的仍要从主库查询。
mysql的复制原理
1、首先mysql主库在事物提交时会把数据库变更作为事件Events记录在二进制文件binlong中;
mysql主库上的sys_binlong 控制binlong日志刷新到磁盘
2、主库推送二进制文件binlong中的事件到从库的中继日志relay log,之后从库根据中继日志重做数据库变更操作,通过逻辑复制,以此来达到数据一致。
mysql通过3个线程来完成主从库之间的数据复制:其中Binlong Dump线程跑在主库上,I/o线程和sql线程跑在从库上,当从库启动复制时,首先创建I/O线程连接主库,主库随后创建binlog Dump线程读取数据库事件并发给I/O线程,I/O线程获取到数据库事件更新到从库的中继日志Realy log中去, 之后从库上的sql 线程读取中继日志realy log中更新的数据库事件并应用。
复制的常见三种架构
一主多存
多级复制
双主复制
mysql主从复制解决的问题
数据分布:随意开始或停止复制,并在不同地理位置分布数据备份
负载均衡:降低单个服务器的压力
高可用和故障切换:帮助应用程序避免单点失败(如:现在突然有台服务器挂掉了,这时候也不用害怕,因为有其他的备份机器,有其他正在运行的从机,立马切换过来就可以,服务器不会受到任何影响的)
升级测试:可以使用更高版本的MySQL作为从库(先看看查询方面有没有问题)
简述mysql分表操作和分区操作的工作原理,分别说说分区和分表的使用场景和各自的优缺点
分区表的工作原理
对用户而言,分区表是一个独立的逻辑表,但是底层的mysql将其分成多个物理字表,这对用户来说是透明的,每一分区表都会使用一个独立表文件
适用场景
1、表非常大,无法全部存在内存,或者只是表的最后有热点数据,其他都是历史数据
2、分区表的数据更容易维护,可以独立的分区进行独立的操作
3、分区表的数据可以分布在不同的机器上,从而高效使用资源
4、可以使用分区表来避免某些特殊的瓶颈:
5、可以备份和恢复独立的分区
限制
1.一个表最多只能有1024个分区
2.5.1版本中,分区表表达式必须是整数,5.5可以使用列分区
3.分区字段中如果有主键和唯一索引列,那么主键列和唯一列都必须包含进来
4.分区表中无法使用外键约束
5.需要对现有表的结构进行修改
6.所有分区都必须使用相同的存储引擎
7.分区函数中可以使用函数和表达式会有一些限制:
8.某些存储引擎不支持分区;
9.对于MyISAM的分区表,不能使用 load index into cache;
10.对于MyISAM表,使用分区表时需要打开更多的文件描述符
2、分库分表的原理
工作原理:通过一些HASH算法或者工具实现将一张数据表垂直或水平进行物理切分
适用场景:1.单表记录条数达到百万到千万级别时 2.解决表锁的问题
分表方式:1.水平分割(表很大,分割后可以降低在查询时需要读取的数据和索引的页数,同时也降低了索引的层数,提高查询速度)
适用场景:1.表中的数据就有独立性,例如表中分别记录各个地区的数据或者不同时期的数 据,特别是有些数据常用有些不常用
2.需要把数据存放在多个介质上(最新的数据放到不同服务器上,或者做缓存)
缺点:给应用增加复杂度,通常查询时需要多个表明,查询所有数据都需要union操作
在许多数据库应用中,这种复杂性会超过给他带来的优点,查询时会增加读一个索引层的磁盘次数(从某种意义上说,会降低效率)
第二种分表方式:2.垂直分表(把主键和一些列放在一个表,然后把主键和另外的列放在另一个表中)
使用场景:1.如果一个表中某些列常用,而另外一些列不常用(可以把常用的列单独拆分出来,查询的时候只查询常用列即可)
2.可以使数据行变小,一个数据页能存储更多数据,查询时减少I/o次数
缺点:1、管理冗余列,查询所有数据需要join操作;
2、整体缺点:有些分表的策略基于应用层的逻辑算法,一旦逻辑算法改变,整个分表逻辑都会改变,扩展性较差;
3、对于应用层来说,逻辑算法无疑增加开发成本
设定网址的用户数量在千万级,但是活跃用户的数量只有1%,如何通过优化数据库提高活跃用户的访问速度
使用分区:可以使用Mysql的分区,因为mysql分区可以帮助我们按照一个规则(把活跃的用户分在一个区,不活跃的用户分到另一个区,本身活跃区用户数据量比较少,因此可以提高活跃用户的访问速度)
使用分库分表:通过水平切分的方式分表,把活跃用户分在一张表,不活跃用户分在一张表,可以提高活跃用户访问速度。
mysql基本操作
我们通常可以将sql分为三类:DDL(数据定义语言)、DML(数据操作语言)和DCL(数据控制语言)。DDL主要用于创建(create)、删除(drop)、修改(alter)数据库中的对象,比如创建,删除和修改二维表;DML主要负责插入数据(insert)、删除数据(delete)、更新数据(update)和查询(select);DCL通常用于授予权限(grant)和召回权限(revoke)。
定义表结构为每个字段选择数据类型时,如果不清楚那个数据类型更合适,可以通过mysql的帮助系统来了解每种数据类型的特性,数据的长度和精度等相关信息
? data types
?varchar
注意char和varchar的区别
char的执行效率高于varchar,varchar相对于char节省存储空间
如果使用char传入的数据的长度小于指定的长度的时候存储的实际长度不够的会用空格来填充
如果使用varchar传入的数据的长度小于指定的长度的时候,存储的实际长度为传进来的数据长度
数据库引擎
1.常用的数据库引擎:myisam、innoDB、archive、ndb、memory
2.myisam和innoDB的区别
myisam查询速度快,不支持事务,不支持外键,支持表锁
innodb增删改效率高,支持事务,支持外键,支持行锁
重要的概念
范式理论-设计二维表的指导思想
1、第一范式:数据表的每个列的值域都是由原子值组成的,不能够在分割。
2、第二范式:数据表里的所有数据都要和该数据表都要和该数据表的键(主键与候选键)有完全依赖关系。
3、第三范式:所有非键属性都只和候选键相关性,也就是说非键值属性之间应该是独立无关的
数据完整性
1.实体完整性-每个实体都是独一无二的
主键(primary key)/唯一约束/ 唯一索引(unique)
2.引用完整性-关系中不允许引用不存在的实体
外键(foreign key)
3.域完整性-数据是有效的
数据类型及长度 非空约束(not null) 默认值约束(default) 检查约束(check)
说明:在mysql数据库中,检查约束并不起作用
事务
1.事务:一系列对数据库进行读/写的操作,这些操作要么全都成功,要么全都失败。
表的数据库引擎必须是innoDB,innodb支持事务,myisam不支持事务
修改表引擎:alter table 表明 engine = innodb
2.事务的ACID特性:
原子性:事务作为一个整体被执行,包含在其中对数据库的操作要么全部被执行,要么都不执行
一致性:事务应确保数据库的状态从一个一致状态转变为另一个一致状态
隔离性:多个事物并发执行时,一个事务的执行不应影响其他事务的执行
持久性:已被提交的事务对数据库的修改应该永久保存在数据库中
3.mysql中的事务操作
1、开启事务环境
start transaction 或 begin
2、提交事务(会把数据写到硬盘)
commit
3、回滚事务(定义:是指将该事务已经完成对数据库的更新操作的撤销)
rollback
mysql索引
mysql中,所有数据类型的列都可以称为索引,长用那个的存储引擎InnoDB和MyISAM能支持每个表创建16个索引。InnoDB和MyISAM使用的索引底层算法是B-tree(B树),B-tree是一种自平衡的树,类似于平衡二叉树,能够保持数据有序,这种数据结构能够让查询数据,顺序访问,插入数据及删除的操作都在对数时间内完成。
InnoDB是唯一能够支持外键,事物以及行锁的存储引擎,所有我们之前说它更适合互联网应用,而且它也是比较新的Mysql版本中默认使用的存储引擎 (B-tree索引)
索引的设计原则:
1.最合适索引的列是出现在where子句和having连接子句中的列。
2、索引列的基数越大(取值多重复值少),索引的效果就越好
3、使用前缀索引可以减少索引占用的空间,内存中可以缓存更多的索引。
4、索引不是越多越好,虽然索引加速了读的操作(查询),但是写操作(增删改)都会变的更慢,因为数据的变化会导致索引的更新,就如同书籍章节的增删需要更新目录一样
5、使用InnoDB存储引擎时,表的普通索引都会保存主键值,所有主键要尽可能选择较短的数据类型,这样可以有效的减少索引占用的空间,利用提示索引的缓存效果
索引的优点
1.可以大大加快数据的检索速度
2.唯一索引可以保证数据的唯一性
3.可以降低分组,排序的时间
4.可以使用查询优化器提高系统性能
索引的缺点
建立索引会建立对应索引文件,占用大量空间
建立索引会降低增、删、改的效率
不建立索引
频繁更新的字段不要建立索引
没出现在where、having,不要建立索引
数据量少的表没有必要建立索引
唯一性比较差的字段不要建立索引
索引的分类
普通索引
create index 索引名 on 表名(字段 asc/desc)默认asc升序
唯一索引 :在唯一索引所在列不能有重复值,增加和修改会受影响。
creat unique index 索引名 on 表名(字段名 asc/desc)默认asc升序
复合索引(联合索引)索引了多个列
使用联合索引,必须包含左前缀(a,b,c)
不使用索引的;(b b,c)
删除索引
drop index 索引名 on 表
外键
如果表A的主关键字是表B中的字段,则字段称为表B的外键,表A称为主表,表B称为从表
数据表引擎必须是innodb
主表和从表相关的外键字段类型必须是兼容
外键取值,要么为空,要么必须是主表中存在的值
数据库的备份与恢复
备份
不用登陆mysql,直接执行mysqldump命令,将指定数据库备份到家目录下的指定文件 mysqldump -uroot -p 数据库名 > ~/备份文件名.sql;
恢复
首先要创建一个mysql数据库,然后退出mysql,执行以下命令mysql -uroot -p 数据库名 < ~/备份文件.sql
存储过程
存储过程是事先编译好存储在数据库中的一组sql的集合,调用存储过程可以简化应用程序开发人员的工作,减少与数据库服务器之前的通信,对于提升数据操作的性能也是有帮助的,其实迄今为止,我们使用的sql语句都是针对一个或多个表的单条语句,但是实际开发中常会用到某个操作需要多条sql语句才能完成的情况,例如,电商网站正在受理用户订单时:
1.通过查询来核对库存中是否有对应的物品以及库存是否充足。
2.如果库存有物品,需要锁定库存以确保这些物品不能再卖给别人,并且要减少可用的物品数量以反映正确的库存量。
3.如果库存不足,可能需要进一步与供应商进行交互或者至少产生一条系统消息提示。
4.不管受理订单是否成功,都需要产生流水记录,而且需要给对应的用户产生一条通知信息
我们可以通过存储过程将复杂的操作封装起来,这样不仅有助于保证数据的一致性,而且将来如果业务发生了变动,只需要调整和修改存储过程即可。对于调用存储过程的用户来说,存储过程并没有暴露数据表的细节,而且执行存储过程比一条条的执行一组sql要快的多。
下面的存储过程实现了查询某门课程的最高分、最低分和平均分。
dropprocedureifexistssp_score_by_cid;
delimiter$$
createproceduresp_score_by_cid(
courseIdint,
outmaxScoredecimal(4,1),
outminScoredecimal(4,1),
outavgScoredecimal(4,1)
)
begin
selectmax(score)intomaxScorefromtb_record
wherecid=courseId;
selectmin(score)intominScorefromtb_record
wherecid=courseId;
selectavg(score)intoavgScorefromtb_record
wherecid=courseId;
end$$
delimiter;
callsp_score_by_cid(1111,@a,@b,@c);
select@a,@b,@c;
说明:在定义存储过程时,因为可能需要书写多条SQL,而分隔这些SQL需要使用分号作为分隔符,如果这个时候,仍然用分号表示整段代码结束,那么定义存储过程的SQL就会出现错误,所以上面我们用delimiter $$将整段代码结束的标记定义为$$,那么代码中的分号将不再表示整段代码的结束,需要马上执行,整段代码在遇到end $$时才输入完成并执行。在定义完存储过程后,通过delimiter ;将结束符重新改回成分号。
上面定义的存储过程有四个参数,其中第一个参数是输入参数,代表课程的编号,后面的参数都是输出参数,因为存储过程不能定义返回值,只能通过输出参数将执行结果带出,定义输出参数的关键字是out,默认情况下参数都是输入参数。
调用存储过程。
callsp_score_by_cid(1111,@a,@b,@c);
获取输出参数的值。
select@aas最高分,@bas最低分,@cas平均分;
删除存储过程。
dropproceduresp_score_by_cid;`
Redis
redis的哨兵(Sentinel)系统用于管理多个redis服务器(instance),该系统执行以下三个任务:
监控:sentinel会不断地检查你的主服务器和从服务器是否运行正常
提醒:当被监控的某个redis服务器出现问题时,Sentinel可以通过API像管理员或者其他应用程序发送通知。
自动鼓掌迁移:当一个主服务器不能正常工作时,Sentinel会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器。
Redis Sentinel是一个分布式系统,可以在一个架构中运行多个Sentinel进程,这些进程使用流言协议来接受关于主服务是否下线的信息,并使用投票协议来决定是够执行自动故障迁移,以及选择哪个从服务器作为新的主服务器。
虽然Redis Sentinel释出一个单独的可执行文件redis-sentinel,实际上他只是一个运行在特殊模式下的redis服务器,可以在启动一个普通的redis服务器时通过给定--sentinel选项来启动redis sentinel。
Redis简介
是key-value存储系统。
redis优点:redis的读写性能极高,并且有丰富的性能(发布/订阅、事物、通知等)。
redis支持数据的持久化(RDB和AOF两种方式),可以将内存中数据保存在磁盘中,重启的时候可以再次加载使用。
redis支持多种数据类型包含:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(zset)、位图(bitmap)、基数统计(hyperloglog )。
redis支持主从复制(实现读写分析)以及哨兵模式(监控master是否宕机并自动调整配置)
redis支持分布式集群,可以很容易的通过水平扩展来提升系统的整体性能。
redis基于TCP提供的可靠传输服务进行通信,很多编程语言都提供了redis客户端支持。
redis的应用场景
1.高速缓存---将不常变化但又经常被访问的热点数据放到Redis数据库中,可以大大降低关系型数据库的压力,从而提升系统的响应性能。
2.排行榜---很多网站都有排行榜功能,利用redis中的列表和有序集合可以非常方便的构造各种排行榜系统
3.商品秒杀/投票点赞-redis提供了对计数操作的支持,网站上常见的秒杀、点赞等功能都可以利用redis的计数器通过+1 或 -1的操作来实现,从而避免了使用关系型数据库update操作
4.分布式锁- 利用redis可以跨多台服务器实现分布锁(类似于线程锁,但是能够被多台机器上的多个线程或进程共享)的功能,用于实现一个阻塞式操作。
5.消息队列- 消息队列和高速缓存一样,是一个大型网站不可缺少的基础服务,可以实现业务解耦和非实时业务削峰等特性。
django 的架构设计,是遵循mvc设计模式的框架:分别代表,模型,模板,视图
也是 mtv的设计模式,分别代表模型,模板,视图
django框架方便,快捷,容易维护,数据库驱动的应用程序,框架中还包含许多强大的应用程序
flask是一个轻量级可定定制的框架,灵活,轻便,安全且容易上手
Tornado 他是非阻塞式服务器,速度相当快,相当于更高级的私人定制,是一个实时web框架