1.web程序运行的基本流程前端
{客户端发送请求 <-----> 服务器返回响应}python
2.使用框架能够下降开发难度,提升开发效率。mysql
3.Flask框架的基本认识:web
特色:用Python语言实现的轻量、简洁、扩展性强ajax
核心:werkzeug 和 Jinja2sql
4.虚拟环境:数据库
建立虚拟环境:mkvirtualenv -p python3 名称json
进入虚拟环境:workonflask
退出虚拟环境:deactivate后端
移除虚拟环境:rmvirtualenv 名称
5.依赖包:
生成依赖包:pip freeze > requirements.txt
安装依赖包:pip install -r requirements.txt
6.基本程序:
建立程序实例:__name__参数为字符串,表示模块名,能够肯定程序所在位置,若是传入标准模块名,会影响静态路径的访问,不会影响视图函数的访问。
定义装饰器路由:经过程序实例调用route函数实现,底层是经过add_url_rule()函数实现,第一个参数rule、第二个参数endpoint(视图函数名的字符串形式),第三个参数视图函数名。
启动服务器:run方法能够启动服务器,能够指定调试debug,便于调试代码信息,自动跟踪代码的变化。
1 # 导入Flask 2 from flask import Flask 3 4 # 建立Flask类的对象 5 # 结论:__name__参数的做用:确认程序实例文件所在的位置。 6 # 一、必需要传入参数 7 # 二、参数类型必须是字符串 8 # 三、若是传入标准模块名,只会影响静态路径的访问,不会影响视图函数的访问。 9 app = Flask(__name__) 10 11 12 # 定义路由url地址 13 # endpoint:表示视图函数名的字符串形式。 14 # 不使用装饰器也能够实现路由映射。 15 16 @app.route('/Lee',methods=['POST','GET']) 17 def hello2018(): 18 # return 能够返回状态码,也能够返回不符合http协议的状态码,用来实现先后端的数据交互 19 """ 20 前端发送ajax: 21 $.ajax({ 22 url:'/Lee', 23 data:。。。, 发送到后端的数据 24 contentType:'', 发送到后端的数据类型 25 dataType:'json' 后端返回的数据类型 26 success:function(resp){ 27 if (resp == '888'){ 28 alert(errmsg) 29 }else{ 30 31 } 32 33 34 } 35 }) 36 37 errno=888,errmsg='用户名已注册' 38 39 40 :return: 41 """ 42 return 'hello world2018',888 43 # self.add_url_rule(rule, endpoint, f, **options) 44 # 经过程序实例调用添加url规则,也能够实现路由映射。 45 # app.add_url_rule('/123','hello2018',hello2018) 46 47 # 结论: 48 # 一、视图函数不能重名。 49 # 二、url能够重复,不一样的http请求方法,是对应不一样的操做get查询post插入put修改delete删除 50 # @app.route('/') 51 # def hello2019(): 52 # a = 1 53 # b = 2 54 # return a,b 55 # 不能返回字典 56 # my_dict = {'a':'123'} 57 # return my_dict 58 # 不能返回列表 59 # my_list = [1,2,3] 60 # return my_list 61 # 能够返回元组 62 # return 'hello world' 63 64 65 # 启动服务器 66 # __name__表示当前模块名,若是被导入文件的时候__name__表示文件名 67 if __name__ == '__main__': 68 # 查看路由映射:具体的url地址和视图函数名的指向关系。 69 print(app.url_map) 70 # debug调试模式:帮助定位错误信息,自动跟踪代码的变化 71 app.run(debug=True)
7.基本程序扩展:
视图函数不能重名
URL能够重复,由于不一样的http请求方法表明不一样的操做
路径的访问顺序是从上到下依次查找,若是找到不会继续往下查找
8.加载配置信息:
加载配置对象
加载配置文件ini格式文件
加载环境变量
1 from flask import Flask 2 # 导入配置类 3 # from config import Config 4 from config import config_dict 5 app = Flask(__name__) 6 # 加载配置文件:三种实现形式 7 # 一、加载配置对象,config是flask内置的配置对象 8 # 重点掌握:由于扩展性更强 9 # app.config.from_object(Config) 10 # app.config.from_object(config_dict['pro']) 11 # 二、加载配置文件 12 # app.config.from_pyfile('config.ini') 13 # 三、加载环境变量 14 # app.config.from_envvar('SET') 15 16 17 @app.route('/') 18 def index(): 19 return 'hello world' 20 21 if __name__ == '__main__': 22 app.run()
config.py文件:
# 基本配置类 class Config: DEBUG = None # 开发模式配置 class DevelopmentConfig(Config): DEBUG = True # 生产模式配置 class ProductionConfig(Config): DEBUG = False # 定义字典,实现配置类的映射 config_dict = { 'dev':DevelopmentConfig, 'pro':ProductionConfig }
9.状态码:
return能够返回不符合http协议的状态码,用来先后端的数据交互。
10.重定向:
redirect----参数是具体的URL地址
url_for ----参数是视图函数名(端点endpoint)
# 导入flask内置的函数redirect from flask import Flask,redirect,url_for app = Flask(__name__) # 重定向redirect:接收参数为location,具体的url地址 # 从新发送网络请求,跳转页面 # 当项目路径(url)或文件发生变化的状况下,可使用重定向。 @app.route('/') def index(): url = 'http://www.baidu.com' # 重定向到百度 return redirect(url) # url_for反向解析:接收的参数endpoint,视图函数名 @app.route('/for') def demo_url_for(): return redirect(url_for('index')) if __name__ == '__main__': print(app.url_map) app.run(debug=True)
11.Flask最基础框架:
1 from flask import Flask 2 3 app = Flask(__name__) 4 5 6 @app.route("/") 7 8 def index(): 9 10 return 'hello world' 11 12 13 if __name__ == '__main__': 14 15 app.run()
12.请求上下文:
request :请求对象,封装了客户端请求的参数信息;
session :封装了客户信息,能够用来获取或设置用户信息;
13.应用上下文:
g对象 :临时请求过程当中存储信息,请求结束后会被销毁;
current_app : 在程序运行过程当中,一直存在,保存程序的基本信息;
14.请求勾子:
before_first_request :在第一次请求前运行
before_request:每次请求前运行
after_request:在每次请求后运次,没有异常状况下,指定后端返回的数据格式
teardown_request:即便没有异常的状况下,在每次请求后运行
15.Flask扩展命令行:自定义ip和port,配合Migrate实现数据库的迁移
16.模板:
模板的本质是文件,做用是接收视图的返回结果,渲染响应数据
变量:存储视图返回的结果 {{ 变量名 }}
判断语句:控制输出
{% if 表达式 %}
{% endif %}
项目中使用的atrTemplate前端模板:
{{ each house as houseas}}
数据:
{{ each }}
17.过滤器:本质是函数,做用计算或格式化输出数据
常规过滤器名:
safe禁用模板转义
capitalize首字符大写:title/lower/upper/formart/striptag/reverse
列表处理:sum/sort/first/last
过滤器的使用:能够链式使用,执行过程,从前到后,依次执行
18.自定义过滤器:
1.自定义函数,而后添加模板过滤器,app.add_template_filter(),第一个参数为函数名,第二个参数为自定义过滤器名称,若是过滤器名和内置过滤器重名,会重写内置过滤器;
2.以装饰器的形式实现自定义过滤器,@app.template_filter(),只须要传入自定义的过滤器名;
19.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信息,实现跨站请求保护
20.继承、宏、包含:三者皆可实现代码复用
一、继承:block,实现模板页面固定不变的区域,通常用来写菜单,底部栏等,模板不支持多继承,继承的实现须要加上区域块的名称;建议继承语句写在模板页面的顶部;
2.宏:macro,实现模板页面动态(功能)代码块的封装,相似Python中的函数;
3.include:实现原始静态页面的完整复用,wtf表单对象不能复用。
21.Flask中的特殊变量和方法:
config对象:保存配置信息,设置数据库放入链接、SECRET_KEY,config能够导入配置文件,读取配置文件;
request经常使用的属性:args / form / data / method / files;
url_for:反向解析,实现从视图函数找到具体的url,通常用来配合redirect实现页面的重定向;
return redirect(url_for(视图函数名)):重定向建议使用url_for,简化页面重定向的操做;
flask消息闪现,在视图中定义提示用户信息,在模板页面中使用循环展现提示信息for x in get_flashed_messages()
22.数据库:
Flask_SQLAlchemy扩展包
实力化sqlalchemy对象,须要和应用程序实例进行关联db = sqlalchemy(app)
首先,须要手动建立数据库,其次,配置数据库的链接和动态追踪修改
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@localhost/database'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
在请求过程自动提交数据的设置,在将来版本中会被删除
23.自定义模型类:
1.继承自db.Model
2.指定表的名称,建议项目名和表名,单个表名建议使用复数
3.定义字段,db.Column()指定字段属性约束,主键、外键、惟1、默认值等;
4.反向引用,us = db.relationship('USER',backre='role');
24.实现一对多或多对一的查询:在数据库中没有具体的字段
us能够实现多对一的查询
role能够实现多对一的查询,在多的一方指定外键
多对多的关系映射,本质就是两个一对多,数据的存储在第三张表
25.db.session数据库会话对象,封装了对数据库的操做
db.session.add()提交一条数据
db.session.add_all()提交多条数据
db.session.create_all()建立表
db.session.drop_all()删除表
db.session.rollback()回滚
26. 基本查询:
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':'Lee'})
27. 蓝图:
1.类、模块化应用的容器;延迟建立路由映射
2.建立蓝图对象:
api = Blueprint('api',__name__)
使用蓝图对象:
@api.route()
一、能够在建立蓝图对象的文件中使用
二、能够导入其余文件中,可是须要把其余文件再次导入到当前建立蓝图对象的文件中,须要避免循环导入的问题,交错导入,
三、注册蓝图路由,在建立应用程序实例的地方,app.register_blueprint(api.url_prefix='/api/v1.0')
28. 单元测试:
测试的目的:为了检验功能代码预期结果和实际结果的差距
使用unittest测试模块
单元测试的书写:本质是断言代码,
一、自定义测试类,须要继承自unittest.TestCase
二、测试方法,setUp()方法名不能改变,通常用来定义测试代码执行前的准备工做,包括建立客户端,指定链接数据库,构造程序实例等
三、测试方法,teatDow()方法名不能改变,通常用来定义测试代码执行后的清除工做,好比清除测试数据,清空缓存等;
四、测试方法的函数名必须test开头;assert断言测试结果
29. 部署:
gunicorn -w 开启的进程数 -b 绑定的ip和port 启动文件名:程序实例名
正向代理:面向客户端,服务器不知道访问的客户是谁
反向代理:面向服务器:客户端不知道访问的服务器是谁
30. REST ful API设计:
域名、版本、路径、请求方法、返回结果、状态码、错误信息、过滤信息、数据交互格式、连接相关资源
31. 性能:
提升用户体验,减小响应时间
性能优化:web前端优化、web后端优化、存储、运维优化
后端优化:
一、使用缓存,能够把大量访问,又不是常常修改的数据放入缓存中,好比项目首页信息
二、使用异步:封装请求,实现对数据异步操做;
三、多线程:线程数和硬件条件,以及对服务器的操做类型的不一样而不一样,IO密集型能够采起多线程的形式提升效率,计算型的任务不适合;
四、存储优化;