域名出售
域名出售
域名
释义
出售状态
价格
paobuquan.com
跑步圈?
未出售
¥600
ruannai.com
软、奶?
未出售
¥600
ninth.games
第九艺术-游戏?
未出售
¥800
联系邮箱:chaizzok@163.com
Flask源码解析之启动流程(FlaskV3.0.x)
Flask源码解析之启动流程1. 最小的 Flask 程序12345678910111213# app.pyfrom flask import Flask # ①app = Flask(__name__) # ②@app.route("/") # ③def hello_world(): return "<p>Hello, World!</p>"if __name__ == '__main__': app.run() # ④
我们先从使用代码启动的方式来看, 暂时不看使用命令行的方式启动的过程。
我们安装代码的执行顺序从上往下看
①第一步 导入Flask对象。
②实例化app对象。在内部执行类的__init__方法。
③创建路由和视图函数。
④执行 app.run()。
2. 查看 app 源码我们进入app的源码中查看__init__发生了什么(其他的一些类属性先不管)。
12345678910111213141516171819202122232 ...
Flask源码解析之路由(FlaskV3.0.x)
Flask源码解析之路由
须知:
Flask 版本 3.0.x Flask 在3.0 版本对代码进行了重构,使 Flask 和 Blueprint 类具有 Sans-IO 基础。
1. FBV 模式我们从最小的Flask程序开始入手
1234567891011from flask import Flaskapp = Flask(__name__)@app.route("/")def hello_world(): return "<p>Hello, World!</p>"if __name__ == '__main__': app.run()
路由是使用app.route使用装饰器的方式进行声明,装饰器的执行逻辑:
先执行 app.route('/') ,得到一个返回值是一个函数decorator。
1234567891011121314# 源码内容:class Scaffold: # 省略 ... @ ...
Pythonista开发前的基础工作之浏览器篇
Pythonista开发前的基础工作之浏览器篇1 浏览器的选择浏览器这个东西因人而异,每个人的使用习惯不一样,根据自己的习惯选择就好。
目前的主流浏览器有:Chrome、Edge、Safari、Firefox。
之前还听说过一个浏览器叫做ARC,使用习惯好像上面那些传统的浏览器不一致,比较新颖。不过目前好像不支持windows,也没用过,使用过的小伙伴可以说一下感受。
我的选择:Chrome。
之前参考过一篇文章,然后倒腾了下Edge dev版本, 使用的侧边栏的形式,也是使用了大概两周,但是在一些方面感觉还是不如Chrome用的顺手,就又换了回去。
2 浏览器设置首先Google账号必须要设置的,不使用账号登录的话,同步功能无法很好的使用。
浏览器的一些具体配置,首先打开浏览器的设置界面:
第一栏您与Google-> 同步功能和 Google 服务的允许登录和改进搜索建议是开启的,其他选项都是关闭的。
第三栏隐私与安全->隐私保护指南里面历史同步记录是开的,保护级别为标准保护,第三方 Cookie 偏好设置为在无痕模式下阻止第三方 Cookie。 ...
Vue3组件相关知识
Vue3组件相关知识当我们去开发一个项目时,出现频率比较高的一个组件我们可以把他抽离为一个==全局组件==,直接在其他的组件上使用。当我们在一个页面上模块非常多,我们可以把每个模块当做一个==局部组件==,在一个页面内引入使用。==递归组件==就是我们需要重复的在一个组件内复用自己,比如像是菜单或者是树形结构,就是通过递归得到的结构。
同时我们也可以在某个组件中动态的切换其他的组件,来达到v-if的效果。
局部组件我们定义的每一个Vue文件就是一个组件, 在使用局部组件时直接引入就可以直接使用。
全局组件注册全局组件的方式
123456789// main.tsimport Example from 'xxx/xxx/index.vue' // 第一个参数:组件名,可以任意定义,此处和组件实例同名// 第二个参数:引入的组件实例app.component('Example', Example)app.mount('#app')
使用的方式:
直接在其他的任意组 ...
MySQL架构
MySQL架构逻辑架构1、常规的C/S架构中的最外层:鉴权、连接处理
2、解析查询、优化 (优化器会向存储引擎询问执行操作的成本和表数据的统计信息)
3、存储引擎
==*== 在5.7.2 版本开始将查询缓存层标记为弃用,8.0版本中完全被移除。(为什么被弃用:随着并发性要求的增高,查询缓存层起不到太大的作用。)缓存重心迁移到Redis或者Memcached。
并发控制多个线程同时对数据进行读写就会遇到并发的问题。
处理上述的读写访问的系统,一种经典的解决方案是:实现一种共享锁/排他锁,也叫做读锁/写锁的锁系统。
读锁是共享的,不互相阻塞的,一个资源可以被多个客户端同时访问;写锁是排他的,也就是说一个写锁即会阻塞其他的写锁,也会阻塞读锁,防止一个客户端读取正在写入的资源。
锁的粒度如果要进一步的提高并发性,就要确保锁定的对象是具有选择性的,尽量只锁定需要修改的数据,而不是所有的资源。
锁定策略在执行锁的时候,也会产生开销,比如获取锁, 释放锁,检查锁是否空闲。对锁的管理和对数据的读写需要进行平衡。
MySQL对锁做出的平衡MySQL的不同的存储引擎给出了不同的锁策略和不同的锁粒度。锁粒 ...
创建高性能的索引
创建高性能的索引索引是一种快速找到记录的数据结构
B-Tree索引我们把它读作B+树索引,是一种特殊的树形结构。
自适应哈希索引
InnoDB 发现当某些索引值被频繁的访问时,会在原有的b+树索引上在构建一个哈希索引,使其也具备了哈希索引的优势。这些操作是InnoDB自动完成的,用户无法控制,不过可以通过参数关闭这个特性。
B+树索引的一些限制:
不符合最左前缀。即a、b、c三个索引只使用b、c索引。
不能跳过索引中的列。
like 条件, 但是%在开头的情况下不会走索引(也没那么绝对)
全文索引它查找的是文本中的关键词,而不是直接比较索引中的值。
前缀索引有时候为了提升索引的性能,同时也节省索引空间,可以只对字段的前一部分字符进行索引。但是也有缺点:MySQL无法使用前缀索引做ORDER BY和GROUP BY操作,也无法使用前缀索引做覆盖扫描。
索引的选择性索引的选择性是指,不重复的索引值(也称为基数,cardinality)和数据表的记录总数(#T)的比值,范围从1/#T到1之间。索引的选择性越高则查询效率越高,因为选择性高的索引可以让MySQL在查找时过滤掉更多的行。唯一索 ...
查询性能优化
查询性能优化优化数据访问1、是否在查询中包含了大量的不需要的行
2、服务器是否在分析大量的不需要的行。
针对第一点我们要规避的一些操作:
查询了100行 只显示10行。
多表连接时返回全部列。
使用select * from …。
重复查询相同的数据。
针对第二点如何确保MySQL是否在扫描一些额外的记录,我们可以通过三个指标进行衡量:响应时间、扫描行数、返回的行数。这是哪个指标们记录到MySQL的慢查询日志中。
MySQL 执行计划的知识补充我们主要查看两个字段的含义:
type:代表我们的查询使用了哪种类型的查询分别有:
system > const > eq_ref > ref > range > index > all。 此值一般要超过range,最好是达到ref是比较合格的一个查询。
Extra: 解析查询的额外信息
Using index:使用索引覆盖扫描(在Extra列中出现了Using index)来返回记录,直接从索引中过滤不需要的记录并返回命中的结果。这是在MySQL服务器层完成的,但无须再回表查询记录。
Using whe ...
MySQL的服务器配置
MySQL的服务器配置查询MySQL的配置1which mysqld
根据找到的mysqld 在进行获取配置文件
1/usr/sbin/mysqld --verbose --help | gerp -A 1 'Default options'
12Default options are read from the following files in the given order:/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
配置文件说明配置文件采用标准INI格式,被分为多个部分,每个部分都以一行包含在方括号中的该部分名称开头。客户端程序也会读取client部分,服务器通常读取mysqld部分。
配置使用小写字母表示,单词之间使用下划线或者短横分隔,两种表示方式都是有效的。(建议使用同一种风格)
除了在配置文件中进行设置外,很多变量(但不是全部)还可以在服务器运行时进行更改。MySQL将这些称为动态配置变量。但是在服务器重启之后更改项就会失效。
MySQL 8.0引入了一个名为持久化系统变量的新功能,语法为:SET PERSIS ...
Schema设计与管理
Schema设计与管理schema 数据类型优化原则
越小的约好
占用的磁盘、内存、cpu缓存的空间少
但要确保不要低估值的范围
简单的数据类型
简单的数据类型的操作需要更少的cpu执行周期
整形笔字符串更好,是因为字符集和排序规则字符串更加的复杂
尽可能使用内置的日期类型
存储IP地址尽可能使用整形
尽量避免存储NULl类型
null是索引和索引统计以及值的比较都更加的复杂
但是设置为not null也不会带来很大的性能提升,具体根据业务情况设定列是否包含空置
整数类型有两种类型的数字:整数和实数(带有小数的数字)。
整数类型存储整数的数据类型有 TINYINT、SMALLINT、MEDIUMINT、INT或BIGINT。
类型
位数
值范围
TINYINT
8
-2^(8-1)^ ~ 2^(8-1)^ - 1
SMALLINT
16
-2^(16-1)^ ~ 2^(16-1)^ - 1
MEDIUMINT
24
-2^(24-1)^ ~ 2^(24-1)^ - 1
INT
32
-2^(32-1)^ ~ 2^(32-1)^ - 1
BIGI ...