0.什么是第三方?
第1方: python所有者,吉多.范罗苏姆
第2方: 我们开发者自己
第3方: 框架提供者,比如flask的提供者是,Armin Ronacher
1.第三方web框架?
是有一些个人或者组织提供的项目半成品,加上了自己公司的业务之后才是一个完成的项目
2.有哪些知名的第三方框架呢?
Django: 是一个web框架,并且是重量级的,因为提供了很全面的工具和扩展.
flask: 是一个轻量级的框架, 只提供了基本的路由路径处理工具(Werkzeug), 和页面渲染功能(jinja2),如果要实现其他额外的功能需要安装扩展包.
Dpark: 分布式框架
Scrapy: 轻量级爬虫框架
Scikit-learn: 机器学习框架...
TensorFlow: 人工智能相关框架.
Apache: 是美国的一个软件基金会组织.里面提供了350多个开源框架.比如:Tomcat,Hadoop,Spark...
3.Flask框架的特点?
诞生时间是2010年,作者是Armin Ronacher,
里面提供了两个核心内容: Werkzeug + jinja2
Werkzeug: 负责处理请求相关内容
jinja2: 负责渲染页面的.
额外扩展: 比如邮件发送Flask_Mail,Flask_Sqlalchemy,等等.
4.什么是虚拟环境?
就是一个特殊的文件夹.
5.为什么要安装虚拟环境?
答:是为了更加方便的调试各种版本的flask,扩展包,python解释器等.
6.如何安装虚拟环境,以及flask版本?
1.查看电脑中是否有虚拟环境?
virtualenv --version
mkvirtualenv --version
2.查看电脑中有那些虚拟环境?
workon
3.创建虚拟环境,创建完成后会自动进入,需要联网
默认安装的是,python2.x
mkvirtualenv 虚拟环境名称
指定安装python3.x
mkvirtualenv -p python3 虚拟环境名称
删除虚拟环境:
rmvirtualenv 虚拟环境
4.退出,进入虚拟环境
deactivate 虚拟环境
workon 虚拟环境名称
-------虚拟环境已经搞定了!
5.安装flask框架包,需要在虚拟环境中
pip install flask==0.10.1
6.查看虚拟环境中有那些扩展包
pip freeze
7.导出虚拟环境中的扩展包?
pip freeze > requirements.txt
8.使用requirements.txt安装扩展包
pip install -r requirements.txt
7.如何使用pytharm关联,安装好的虚拟环境?
a.从终端找到虚拟环境,并进入,which python 获取到虚拟环境路径
b.打开pycharm关联,虚拟环境路径.
8.最简单的helloworld程序?
7行代码
9.helloworld中每句话的含义?
10.url_map,是app身上的一个属性,可以查看访问哪些视图函数和路径之间的关系
格式: app.url_map
返回: 是一个map集合,里面装着地址(路径)和视图函数之间的映射关系
11.如何给存在的视图函数指定访问方式? 可以使用methods
格式: @app.route('/路径',methods=['访问方式1','访问方式2'])
常见的访问方式: GET,POST,PUT,DELETE,等8种
12.url_for(反解析),是flask提供的一个方法,用来通过视图函数名称找到视图函数地址的方法
格式: url_for('视图函数名称',key=value), 返回的是字符串地址
13.redirect,重定向,通过路由地址,找到对应的视图函数名称
格式: redirect('路由地址'), 返回的就是一个响应体对象
14.前后端在交互的时候,格式一般指定成为json格式,因为这样的交互效率最高.
有两种方式可以指定:
1.设置响应体对象的headers属性
resp = make_response('helloworld')
resp.headers['Content-Type'] = 'application/json'
return resp
2.使用flask中提供的方法,jsonify()
dict = {
"name":"zhangsan",
"age":"13"
}
return jsonify(dict)
简化写法:
return jsonify(name='zhangsan',age=13);
15.在访问视图函数的时候,如何指定参数类型,比如:整数,小数,字符串等内容
格式: @app.route('/地址/<参数类型:变量名>')
常见参数类型:
int 整数
float 小数
path 字符串类型
16.如何需要在浏览器的地址中只能接收三个整数,如何解决?
需要自定义类型!
之所以,int,float,path等类型可以接收整数,小数,等是因为系统已经定义好了指定的类型
指定的类型没有办法满足我们的需要,所以需要自定义.
自定义类型(转换器)格式:
1.自定义类,继承自BaseConverter
2.编写初始化方法,init方法,接收两个参数,url_map,regex,并初始化父类空间和子类空间
3.将自定义转换器类,添加到默认的转换列表中
app.url_map.converters[key] = 转换器类
17.自定义转换器方法之to_python方法
执行时间: 匹配到规则之后, 执行视图函数之前
作用: 用来过滤数据,还可以做编码转换
18.abort(代号),主动抛出异常代号
场景: 当访问服务器资源的时候,如果不存在/权限不够,可以直接使用abort抛出异常
errorhandler(代号): 可以捕捉异常代号,返回统一的界面.装饰方法执行
19.在使用app.run()的时候,可以传递参数
参数有: host: IP地址默认是127.0.0.1
参数有: port: Port端口默认是5000
参数有: debug: 默认是False
如果设置成True好处:
1.改变代码之后不需要重新运行,只需要保存即可
2.报错之后有友好提示
20.app运行的时候有些配置信息需要加载,有三种方式可以加载内容
方式一: 可以从类中加载
app.config.from_object(类名称)
方式二: 可以从配置文件
app.config.from_pyfile(文件名称)
方式三: 可以从环境变量加载,依赖文件,不常用
app.config.from_envvar('环境名称key')
作用: 以后可以加载数据库配置信息,redis配置信息,session配置信息
21.request,是Werkzeug提供好的请求对象,里面封装了请求相关的所有信息,比如:请求地址,请求参数,请求方式,等等
request.url: 请求地址
request.method: 请求方式
request.args: 请求参数,并且是问好后面拼接的内容,www.baidu.com?name=zhangsan&age=13
....
1.请求钩子: 在执行视图函数之前会顺带执行请求钩子所装饰的方法
常见的四种请求钩子有:
before_first_request
在处理第一个请求前执行
before_request
在每次请求前执行
如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
after_request
如果没有抛出错误,在每次请求后执行
接受一个参数:视图函数作出的响应
在此函数中可以对响应值在返回之前做最后一步修改处理
需要将参数中的响应在此参数中进行返回
teardown_request:
在每次请求后执行
接受一个参数:错误信息,如果有相关错误抛出
2.后端向前端页面返回数据的时候,有几种响应体格式可以设置
格式一:
a.直接返回, 响应体
return "hello"
b.返回,响应体 + 状态码
return "hello",666
c.返回, 响应体 + 状态码 + 响应头
格式二:
创建响应体,设置内容再返回
resp = make_response('hello')
resp.status = '666'
resp.headers["content-Type"] = "application/json"
3.状态保持,通过cookie和session来进行状态保持
cookie:用来保存浏览器和服务器交互信息的内容,由服务器设置,存储在浏览器
设置方式:
resp.set_cookie(key,value,max_age)
max_age:表示cookie的有效时间
获取方式:
value = request.cookies.get(key)
4.session: 也是用来做状态保持,比如:登陆状态, 适合存储敏感信息,比如,卡号,密码等,由服务器设置,存储在服务器,需要依赖于cookie(sessionID存储cookie)
设置session:
session[key] = value
获取session:
value = session.get(key)
5.flask一共提供了两种上下文
请求上下文:
request: 相当于一个容器,或者是一个线程局部变量.request是和每一个请求相关的.
session: 相当于一个容器,存储在服务器内部的.线程局部变量.
6.应用上下文:
current_app: 相当于是app的一个代理对象,主要使用在模块开发中.
g: 在一次完整的请求中,都是同一个对象.主要配合装饰器使用(先了解,在项目中具体使用)
7.flask_script: flask中没有提供额外的复杂功能,如果需要实现其他额外的功能需要使用扩展包
作用:
1.用来通过命令的方式去启动程序,并且可以指定端口和ip,
2.并且配合flask_migrate可以做数据库迁移.
使用流程:
1.安装,pip install flask_script
2.导入包中类
from flask_scirpt import Manager
3.使用Manager管理app
manager = Manager(app)
8.flask中提供了两个核心功能,werkzueg + jinja2
jinja2就是用来做模板(html文件)渲染,使用的是render_template('页面',key=value,key2=value2)渲染
9.jinja2模板语法:
取变量的值:
{{ 变量名 }}
分支语句if:
{% if 条件A %}
语句1;
{% elif 条件B %}
语句2;
{% else %}
语句3;
{% endif %}
循环结构for:
{% for 变量名 in 容器 %}
{% endfor %}
注释:
{# 注释掉的内容 #}
为什么要使用模板:
1.视图函数只负责处理数据
2.模板只负责渲染数据
3.模板不仅仅可以通过视图函数携带数据渲染,还可以直接编写数据也行
10.过滤器:就是用来过滤需要的数据,jinja2中已经给我们提供了两种常见的过滤器(函数)
a.字符串过滤器
格式:{{ 字符串 | 字符串过滤器 }}
字符串过滤器种类有:
upper: 转大写
lower: 转小写
reverser: 反转
等等..
b.列表过滤器
格式:{{ 列表 | 列表过滤器 }}
列表过滤器:
first: 获取列表第一个元素
last: 列表最后一个元素
sum: 求列表和
sort:列表排序(从小到大)
等等
11.自定义过滤器,当系统提供的过滤器满足不了需要的时候就可以自定义
有两种方式:
a.先定义函数,然后再将函数添加到默认的列表过滤器就可以
def test():
pass
app.add_template_filter(函数名称,'过滤器名称')
b.定义函数的时候,直接使用列表装饰器装饰
@app.template_filter('过滤器名称')
def test()
pass
12.模板复用,有三种形式的复用
a. 宏的复用
b. 继承复用
c. 包含复用
13.宏(macro): 实际上相当于python中函数,提前定义好一段功能,需要的时候调用
定义格式:
{% macro 宏名(参数) %}
{% endmacro %}
在当前文件调用:
{{ 宏名(参数) }}
其他文件定义的,调用
{% import '宏文件名' as 别名 %}
{{ 别名.宏名(参数) }}
14.继承和包含
继承: 共性抽取, 代码复用,并且可以扩展子类自己的内容,更加灵活
格式: {% extends '文件名' %}
包含: 在一个文件中完全拥有另外一个文件的内容
格式: {% include '文件名' %}
父文件名定义,一般切割很多块:
{% block 模块名称 %}
{% endblock %}
15.jinja2中给提供了一些特殊的变量,不需要传递就可以使用
常用的有:
config: app的配置对象
request: 请求对象
url_for(): 方法,通过函数名称找路径
get_flashed_messages(): 消耗消息队列中的数据,也就是存储在flashed()里面的数据