1.flask框架的诞生及特点
诞生于2010年,用python语言实现
轻量的web框架,简洁、扩展性强
核心:werkzeug(工具箱)和Jinja2(模板引擎)
2.flask的使用
建议使用虚拟环境
创建创建虚拟环境:mkvirtualenv 虚拟环境名称
删除虚拟环境:rmvirtualenv 虚拟环境名称
进入虚拟环境:workon 虚拟环境名称
安装依赖文件:pip install -r requirements.txt
生成依赖文件:pip freeze > requirements.txt
项目开发过程中,如果依赖文件发生改变,应及时更新依赖文件
3. 视图
基本程序的实现:Flaks版本的hello world
1、app = Flask(__name__)参数的主要作用,确定程序所在的目录,默认创建静态路由static,访问模板文件;
2、装饰器路由的实现:通过werkzeug的routing模块的装换器实现
Rule类构造具体的(url和视图函数的映射)
Map类存储了多条Rule类(url和视图函数的映射)
MapAdapter类实现把具体的url和视图函数的绑定在一起
动态路由参数:<>里面可以定义动态的参数,默认情况下是字符串类型,可以接收除斜线外的字符串;
1、int和float互不兼容,字符串可以兼容数值;
2、path接收的参数可以有斜线
正则URL:需要继承自BaseConverter转换器
1、需要自定义正则类
2、把自定义的正则类添加到当前应用程序中,app.url_map.converters['regex'] = 自定义的正则类
3、在装饰器中使用转换器
作用:优化访问路径,限制访问
示例:
http://127.0.0.1:5000/static/html/index.html
http://127.0.0.1:5000/index.html
返回状态码:
1、return可以实现自定义的状态码,一般用来实现前后端数据交互
2、abort函数只能抛出符合http协议的状态码,本质类似raise语句,一般用来配合@app.errorhandler()实现自定义错误页面,errorhandler会接收abort函数抛出的状态码
状态保持:http协议的无状态,cookie本质是字典,由于cookie的不安全,出现了session,在客户端写入session_id;
1、设置cookie信息:使用make_response()对象,实现状态保持,response.set_cookie('itcast','python')
2、获取cookie信息:request.cookies.get('itcast')
重定向:redirect,一般在项目文件或目录改变的情况下使用重定向
a = 'http://www.ticas.cn'
return redirect(a) 接收的参数可以是变量名,或是url字符串
4.扩展
请求上下文:
request:请求对象,封装了客户端请求的参数信息;
session:封装了客户信息,可以用来获取或设置用户信息
应用上下文:
g对象:临时请求过程中存储信息,请求结束后会被销毁
current_app:在程序运行过程中,一直存在,保存程序的基本信息;
请求钩子:
before_first_request:在第一次请求前运行
before_request:每次请求前运行
after_request:在每次请求后运行,没有异常的情况下,指定后端返回的数据格式
teardown_request:即使有异常的情况下,在每次请求后运行
Flask扩展命令行:自定义ip和port,配合Migrate实现数据库的迁移;
5. 模板
模板的本质是文件,作用是接收视图的返回结果,渲染响应数据
变量:存储视图返回的结果{{ 变量名 }}
语句:控制输出
{% if 表达式 %}
{% endif %}
项目中使用的artTemplate前端模板
{{ each houses as houseas}}
数据
{{/each}}
过滤器:本质是函数,作用计算或格式化输出数据
常规的过滤器名:
safe禁用模板转义
capitalize首字符大写、title/lower/upper/formart/striptag/reverse
列表处理:sum/sort/first/last
过滤器的使用:可以链式调用,执行过程,从前到后,依次执行
自定义过滤器:
1、自定义函数,然后添加模板过滤器,app.add_template_filter(),第一个参数为函数名,第二个参数为自定义过滤器名称,如果过滤器名和内置过滤器重名,会重写内置过滤器;
2、以装饰器的形式实现自定义过滤器,@app.template_filter(),只需要传入自定义的过滤器名
WTF扩展:实现模板页面的表单代码的复用,以及表单数据的验证
1、自定义表单类,需要继承自FlaskForm;
2、指定表单字段,加入验证函数
3、实例化表单对象,在模板页面中使用表单对象的字段
设置secret_key,生成csrf_token加密口令,实现跨站请求保护,模板页面对应的表单域中需要设置form.csrf_token()
验证器的调用:form.validate_on_submit()执行过程,会依次调用验证函数,其次验证页面中是否设置csrf_token,条件满足返回true,否则返回false
4、表单数据的获取,需要使用表单对象,form.字段名.data
wtf对应的csrfprotect模块可以生成session信息,实现跨站请求保护
继承、宏、包含:
1、继承:block,实现模板页面固定不变的区域,一般用来菜单,底部栏等,模板不支持多继承、继承的结束需要加上区域块的名称;建议继承语句写在模板页面的顶部
2、宏:macro,实现模板页面功能代码块的封装,类似python中的函数
3、包含:include,实现原始静态页面的完整复用,wtf表单对象不能复用;
6. Flask中的特殊变量和方法
config对象:保存配置信息,设置数据库的连接、secret_key,congfig可以导入配置文件,读取配置文件
request:常用的属性:args/form/data/method/files,
get_json()获取请求体中的json数据;
url_for:反向解析,实现从视图函数找到具体的url
一般用来配合redirect实现页面的重定向
return redirect(url_for(视图函数名))
重定向建议使用url_for,简化页面重定向的操作
flash消息闪现,在视图中定义提示用户信息,
在模板页面中使用循环展示提示用户信息for x in get_flashed_messages()
7. 数据库
Flask-SQLAlchemy扩展包
实例化sqlalchemy对象,需要和应用程序实例进行关联db = sqlalchemy(app)
首先,需要手动创建数据库,其次、配置数据库的连接和动态追踪修改
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@localhost/database'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
在请求过程自动提交数据的设置,在未来版本中会被删除
自定义模型类
1、继承自db.Model
2、指定表的名称,建议项目名和表名、单个表名建议使用复数
3、定义字段,db.Column()指定字段的属性约束、主键、外键、唯一、默认值等;
4、反向引用,us = db.relationship('USER',backre='role')
实现一对多或多对一的查询:在数据库中没有具体的字段;
us可以实现一对多的查询
role可以实现多对一的查询,在多的一方指定外键
多对多的关系映射,本质是两个一对多,数据的存储在第三张表
db.session数据库会话对象,封装了对数据库的操作
db.session.add()提交一条数据
db.session.add_all()提交多条数据
db.session.create_all()创建表
db.session.drop_all()删除表
db.session.rollback()回滚
基本查询:
User.query.get()接收的参数为主键
User.query.filter(User.id=user_id)过滤查询,需要指定模型类的类名,需要加上执行器,all()/first()/order_by()
User.query.filter_by(id=user_id)过滤查询,需要传入字段名进行过滤,需要加上执行器
and_/or_/in_/notin_与或非
排序order_by/分页limit/paginate
更新数据:
User.query.filter_by(id=user_id).update({'name':'itcast'})
10. 蓝图
类、模块化应用的容器;延迟创建路由映射
创建蓝图对象:
api = Blueprint('api',__name__)
使用蓝图对象:
@api.route()
1、可以在创建蓝图对象的文件中使用
2、可以导入其他文件中,但是需要把其他文件再次导入到当前创建蓝图对象的文件中,需要避免循环导入的问题,交错导入,
3、注册蓝图路由,在创建应用程序实例的地方,app.register_blueprint(api.url_prefix='/api/v1.0')
11. 单元测试
测试的目的:为了检验功能代码预期结果和实际结果的差距
使用unittest测试模块
单元测试的书写:本质是断言代码,
1、自定义测试类,需要继承自unittest.TestCase
2、测试方法,setUp()方法名不能改变,一般用来定义测试代码执行前的准备工作,包括创建客户端,指定连接数据库,构造程序实例等
3、测试方法,teatDow()方法名不能改变,一般用来定义测试代码执行后的清除工作,比如清除测试数据,清空缓存等;
4、测试方法的函数名必须test开头;assert断言测试结果
12. 部署
gunicorn -w 开启的进程数 -b 绑定的ip和port 启动文件名:程序实例名
正向代理:面向客户端,服务器不知道访问的客户是谁
反向代理:面向服务器:客户端不知道访问的服务器是谁
13. REST ful API设计
域名、版本、路径、请求方法、返回结果、状态码、错误信息、过滤信息、数据交互格式、链接相关资源
14. 性能
提高用户体验,减少响应时间
性能优化:web前端优化、web后端优化、存储、运维优化
后端优化:
1、使用缓存,可以把大量访问,又不是经常修改的数据放入缓存中,比如项目首页信息
2、使用异步:封装请求,实现对数据异步操作;
3、多线程:线程数和硬件条件,以及对服务器的操作类型的不同而不同,IO密集型可以采取多线程的形式提高效率,计算型的任务不适合;
4、存储优化;