flask框架(四)
1.蓝图的基本使用(掌握)
作用:为了进行模块化开发
特点:属于flask自带的,不需要安装扩展就能使用
蓝图的使用流程
1/创建蓝图对象(Blueprint)
2/使用蓝图装饰视图函数
3/将蓝图注册到app中(register_blueprint)
user_blue=Blueprint("user",__name__)
其中的user是自己起的名字,__name__
是固定的
app.register_blueprint(blue)
将蓝图注册到app中,相当于把blue的东西加载到了app身上
可以将不同的功能分离开来,单独放在新的py文件里面,然后导入即可.
小问题:
1/再导入模块的时候,有可能会看到自己自动导入的包和预想的是不一样的,比如说看到了下面三种情况,其实下面三种包内容是一样的,只是新旧版本不一样.之前困扰了我很久,终于解决了,现在分享给大家,希望你不会被困扰.
flask_wtf.csrf
flask.ext.wtf
flask_wtf
2.蓝图单文件使用(掌握)
例子:创建商品蓝图,用户蓝图使用
demo01-03文件
3.以包的形式使用蓝图(掌握)
工作里面很常见,项目中经常使用,要多关注.是一种蓝图使用的标准模式
作用:以包的形式管理使用蓝图,更加灵活
特点:
1/每个蓝图都可以有自己的模板文件,静态文件,配置文件等
user(创建的包)里面,__init__.py
文件和views.py文件
相当于启动入口的的文件demo04package_blueprint.py
在导入的时候,从根目录包的名称开始导入,from user import xxx
系统会自动把user包里面所有的文件从上到下执行一遍,找你要导入的东西.
4.循环导包(理解)
定义:两个文件之间相互引用,并且引用的格式不正确,就会导致程序运行不了
循环导包
注意点:
1/python中允许循环导入,但是导入的结构要合理
解决办法:
报错之后,看报错信息,将提示错误的所有的文件全部打开,然后将每一个文件出问题的行打断点进行调试.
Flask使用Blueprint让应用实现模块化,在Flask中,Blueprint具有如下属性:
1/一个应用可以具有多个Blueprint
2/在一个应用中,一个模块可以注册多次
3/Blueprint可以单独具有自己的模板、静态文件或者其它的通用操作方法
4/在一个应用初始化时,就应该要注册需要使用的Blueprint
5/一个Blueprint并不是一个完整的应用,它不能独立于应用运行,而必须要注册到某一个应用中。
__inint__.py
文件中要记的写导入view文件,要不然会有问题.而且位置也很重要.
5.蓝图参数含义(理解)
user_blue=Blueprint("user",__name__)
蓝图中的参数和app里面的参数差不多,相当于一个小型的app,只不过里面的好多参数定义为none,为了让用户自己定义
参数具体解释:
user
表示蓝图的名字,用来标识蓝图装饰的视图函数所属的蓝图
__name__
固定写法,表示的是蓝图所在包的名字
static_folder="static(在包下面可以自己建立自己的静态文件夹,这个static是自己建立的静态文件夹名字)"
static_folder用来存储静态文件
url_prefix
给所有使用user_blue装饰的视图函数加上一个访问前缀
template_folder
表示蓝图自己的模板文件,如果app中也设置了自己的模板文件,如果文件名相同,那么优先访问app的
蓝图对象中常见的参数:
name
表示蓝图的名字
import_name
表示蓝图所在模块的名字,使用__name__
static_folder
表示蓝图的静态文件夹
url_prefix
蓝图的访问前缀
template_folder
表示蓝图的模板文件
每个包都可以有自己的静态文件.
6.断言(了解)
定义:判断程序执行到某个地方的时候,是否能够达到预期的结果
使用格式:
assert boolean表达式1,异常信息
例子:assert isinstance(num1,int),"num1请输入一个整数"
执行流程:
如果表达式1为True,程序不会抛出异常信息,继续执行,
如果表达式1位False,程序抛出异常信息
使用场景:
1/单元测试
2/写一个框架
7.单元测试流程(了解)
在公司里面有专门的测试人员,我们只需要了解即可
测试分类:
1/单元测试
2/集成测试
3/系统测试
单元测试:
对独立的模块进行测试,是我们要重点关注的内容
流程:
1/定义类,继承自unittest.TestCase
继承自TestCase
的类,可以直接单独运行
2/编写两个固定方法
setup
:测试开始的方法(适合做初始化,比如数据库的连接,表的创建)
测试的内容在中间执行
teardown
:测试结束的方法(适合做,收尾工作,比如数据库删除,会话移除)
测试方法执行的时候有个小特点:就是每次测试的时候,都会执行一下开始和结束的方法.
3/编写自己的测试方法
必须以test开头,要不然测试不了
在pycharm中测试,光标放在哪个函数的内部,就执行哪个测试的方法
8.数据库测试案例(了解)
目的:数据库添加数据是否正常
流程:
1/定义类,继承自TestCase
2/编写两个固定方法setup和teardown
3/编写添加数据的测试方法
测试的时候,不能在正式数据库里面测试,会将原来的数据库信息测试的乱七八糟的,要设置数据库的链接信息,在测试数据库中测试.测试的结果不会对原有数据库有任何影响.想要看到测试数据的话,因为测试过程很短,我们可以延迟操作,然后在测试的时候,进行查看测试数据库.
断言的时候,如果使用在函数内部,记得写self.assert
9.redis概述(理解)
nosql泛指非关系型的数据库,没有外键.不支持sql语法,存储的数据都是kv形式.
秒杀用的到redis
了解:redis是一款nosql,不支持sql语法
特点:
1/c语言编写出来的,读取速度快
2/数据存储在内存中的,但是会将内存中的快照信息保存在磁盘中
3/适合用来做缓存
打开的时候执行下面的命令:
redis-server
启动服务器
redis-cli
连接服务器
10.redis安装说明(了解)
最新的版本是4.0.9
redis是c语言的写的,安装的时候需要编译
.o是c语言编译完成后的文件
.c和.h是c语言的文件
具体安装不做说明
11.redis配置说明(理解)
常见的配置信息:
默认绑定的IP:127.0.0.1
默认端口:6379
daemonize
默认设置为yes,守护进程,命令执行完不会阻塞,而且可以在后台运行
database
默认16个,默认使用0号库,最大号库是15
slaveof
用来配置主从
建议参考文档
启动的是usr/local/bin/redis-server
开启服务器之后,关闭终端,服务器不会关闭,因为设置过
12.String类型(掌握)
nil是空的意思
keys 's*'
中的引号去掉没关系,也是正确的(*匹配的是0到多个)
exists age
存在返回1,不存在返回0
type name
看name类型
expire sex 10
给sex设置有效期为10秒
ttl sex
查看sex的有效期,到期之后会出现-2
keys *
查看所有的key
del
删除key
get heihei
获取heihei的值
append hahah xxixi
增加一个key为hahah,值为xxixi的数据
append name 10
给name的值(是个字符串)增加10,之前为'banzhang',增加之后变为'banzhang10'
setex
设置有效期
mget
查看多个key的值
mset
设置多个键值对
flushall
清空所有数据,清空的就是所有的key
ping
看是否连接服务器,连接上显示pong
13.hash类型(理解)
hset key field value
hset person name laowang
建立一个key为personfiled为name,值为laowang的数据
hset person age 29
给key为person的数据里面添加一个filed为age,值为29的数据
hget person name
取filed为name的值
hmset person sex man height 180
设置多条数据
hkeys person
找里面所有的filed
hdel person sex height
删除
场景:做页面数据缓存
服务器叫做数据缓存,客服端叫做内存
14.list类型(了解)
lpush list 1 2 3 4
从左边添加4个数据
lrange list 0 3
获取上面添加的4个索引0代表的是起始索引,3代表的是结束索引
获取的时候看到的顺序是4.3.2.1,因为从左推进去,那么第二个推进去的时候,第二个从左边数变成了第一个
rpush list 8
从右面推一个8
lrange list 0 -1
获取的结果是43218
linsert list before 3 30
给3前面加入30
linsert list after 2 200
给2后面加入200
lset list 1 300
将1的值变为300
lrange list 0 -1
查看列表所有的值
lrem key count value
key列表,value是值,count是前多少次,count>0从头开始数,count<0从尾部开始数,count=0 查找所有的元素
15.set类型(了解)
特点:大小关系有序,且不重复
sadd set 1 1 2 3 7 6 5 5 8
添加
smembers set
查看所有的值
返回的值是1235678
16.zset类型(了解)
根据权重值去排序
zadd zset 10 zhangsan 20 lisi 30 wangwu
添加值,zhangsan的权重是10
zrange zset 0 -1
取出所有的值
zrangebyscore zset 11 21
获取权重在11到21的所有值
zscore zset wangwu
获取wangwu的权重
zremrangebyscore zset 0 100
删除权重在0到100的值
17.IDE操作string(掌握)
使用流程:
1/安装扩展包
pip install redis
2/导入redis类
from redis import StrictRedis
3/创建redis对象,关联ip和port
redis_store = StrictRedis(host="127.0.0.1",port=6379,decode_responses=True)
decode_responses=True的意思是将取出的数据自动解码,因为取出的数据是二进制的.
4/调用redis的相关方法
redis_store.set("name","banzhang",5)
参数一name表示key,参数二banzhang表示value,参数三5代表的是key-value的有效期,单位是秒
使用的时候全用创建出来的对象进行操作
18.主从搭建(理解)
目的:主写数据,从读数据,实现读写分离
ctrl+a是Linux终端中,快速到行首
ctrl+e是Linux终端中,快速到行尾
19.集群搭建(了解)
为了应对高并发
集群的搭建分为软件层面和硬件层面.
cluster
集群
slots
卡槽
.rb是ruby语言的文件,也是一种脚本语言
redis-cli -h ip地址 -p 端口号
20.session指定存储位置(理解)
定义:用来存储敏感信息,存储在服务器内部
设置:session[key]=value
获取:value=session.get(get)
注意点:设置SECRET_KET
指定session存储到redis中
操作流程
1/安装flask_sess
pip install flas_session
2/导入Session;类
from flask_session import Session
3/设置session相关的配置信息到app中
4/读取app身上的配置信息(和session相关的)
Session(app)
<设置app的配置信息>
app.config["SESSION_TYPE"]="redis"
指定session的存储类型
app.config["SESSION_REDIS"]=StrictRedis()
指定redis服务器地址
app.config["SESSION_USE_SIGNER"]=True
设置session的签名信息
app.config["PERMANENT_SESSION_LIFETIME"]=timedelta(seconds=10)
设置session在redis中的存储时间
session默认有效期是31天
expires
有效期
<读取配置类,加载配置信息到app中>
定义一个类Config,设置这些参数,继承自object类
app.config.from_object(Config)
21注册程序员常用的网站
- github: www.github.com(使用谷歌浏览器有可能会不能注册,更换ie或者win10的浏览器注册成功)
- 码云: www.gitee.com