一、Flask简介:
1. WEB应用程序的本质:
Web(World Wide Web)诞生最初的目的,是为了利用互联网交流工作文档。
2.Web框架:
- 什么是Web框架:
- 协助开发者快发开发Web应用程序的一套功能代码;
- 开发者只需要按照框架约定要求,在指定位置写上自己的业务逻辑代码;
- 例如: 在某个区域需要成立一家医院,有两种方式
- 商圈,打地基.盖楼,装修,入驻
- 买楼,装修,入驻
- 为什么要用Web框架?
web网站发展至今,特别是服务器端,涉及到的知识、内容,非常广泛.这对程序员的要求会越来越高.如果采用成熟,文件的框架,那么一些基础的工作,比如,安全性,数据流控制等都可以让框架来处理,那么程序开发人员可以把精力放在具体的业务逻辑上面。
使用框架的优点:
- 稳定性和可扩展性;
- 可以降低开发难度,提高开发效率;
总结一句话:避免重复造轮子 - 在python中常用的web框架:
- flask:
- django
- tornado
3. Flask:
Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架。
Flask本身相当于一个内核,其他几乎所有功能都要用到扩展(邮件扩展Flask-Mail, 用户认证Flask-Login,数据库Flask-SQLAlchemy), 都需要用第三方的扩展来实现。比如可以用Flask扩展接入ORM、窗体验证工具、文件上传、身份验证等。Flask没有默认使用的数据库,可以算则使用MySQL,也可以使用NoSQL。
其WSGI工具箱采用Werkzeug(路由模块),模块引擎则使用Jinja2。这两个也是Flask框架的核心。
3.2 Flask常用的扩展包:
- Flask-SQLalchemy:操作数据库;
- Flask-script:插入脚本;
- Flask-migrate:管理迁移数据库;
- Flask-Session:Session存储方式指定;
- Flask-WTF:表单;
- Flask-Mail:邮件;
- Flask-Bable:提供国际化和本地化支持,翻译;
- Flask-Login:认证用户状态;
- Flask-OpenID:认证;
- Flask-RESTful:开发REST API的工具;
- Flask-Bootstrap:集成前端Twitter Bootstrap框架;
- Flask-Moment:本地化日期和时间;
- Flask-Admin:简单而可扩展的管理接口的框架
扩展列表: http://flask.pocoo.org/extensions/
- 中文文档(http://docs.jinkan.org/docs/flask/)
- 英文文档(http://flask.pocoo.org/docs/0.11/)
二、虚拟环境:
1. 为什么要搭建虚拟环境?
- 在开发过程中,当需要使用python的某些农工局包/框架时需要联网安装
- 比如联网安装Flask框架flask-0.10.1版本
sudo pip insyall flask==0.10.1
- 提示 : 使用如上命令,会将flask-0.10.1安装到/usr/local/lib/python2.7/dist-packages路径下;
- 问题:如果在一台电脑上,想多开发多个不同的项目,需要用到同一个包的不同版本,如果使用上面的命令,在同一个目录下安装或者更新,新版本会覆盖以前的版本,其他的项目就无法运行了.
- 解决方案 : 虚拟环境
- 作用 :虚拟环境,可以搭建独立的python运行环境,是的单个项目的运行环境与其他项目互不影响.
- 所有的虚拟环境都位于/home/下的隐藏目录.virtualenv下
2.如何搭建虚拟环境:
- 安装虚拟环境的命令:
sudo pip install virtualenv
sudo pip install virtualenvwrapper
安装完虚拟环境后,如果提示找不到mkvirtulaenv命令,需配置环境变量:
# 1、创建目录用来存放虚拟环境
mkdir
$HOME/.virtualenvs
# 2、打开~/.bashrc文件,并添加如下:
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
# 3、运行
source ~/.bashrc
- 创建虚拟环境的命令:
- 提示: 如果不指定python版本,默认安装的是python2的虚拟环境
- 在python2中,创建虚拟环境:
mkvirtualenv 虚拟环境名称 例 : mkvirtualenv py_flask
- 在python3中,创建虚拟环境:
mkvirtualenv -p python3 虚拟环境名称 例 : mkvirtualenv -p python3 py3_flask
- 提示:
- 创建虚拟环境需要联网
- 创建成功后,会自动工作在这个虚拟环境上
- 工作在虚拟环境上,提示符最前面会出现"虚拟环境名称"
3.如何使用虚拟环境:
- 查看虚拟环境:
workon 两次tab键
- 使用虚拟环境的命令:
workon 虚拟环境名称
例 :使用python2的虚拟环境
workon py_flask
例 :使用python3的虚拟环境
workon py3_flask
- 退出虚拟环境:
deactivate
- 删除虚拟环境的命令:
rmvirtualenv 虚拟环境名称
例 :删除虚拟环境py3_flask
先退出:deactivate
再删除:rmvirtualenv py3_flask
4.如何在虚拟环境中安装工具包?
- 提示:工具包安装的位置:
- python2版本下:
~/.virtualenvs/py_flask/lib/python2.7/site-packages/
- python3版本:
~/.virtualenvs/py3_flask/lib/python3.5/site-packages
- python3版本下安装flask-0.10.1的包 :
pip install 包名称
例 : 安装flask-0.10.1的包
pip install flask==0.10.1
- 查看虚拟环境中安装的包:
pip freeze
或:
pip list
三、Hello World
1.创建Python项目:
- 打开 Pycharm,创建 Pure Python 类型的项目,创建项目完成之后选择之前创建的 py3_flask 作为虚拟环境:
第 4 步路径可以通过在指定虚拟环境下,输入 which python 获得
2.实例:
- 新建文件helloworld.py
- 导入Flask类
from flask import Flask
Flask函数接收一个参数__name__, 它会指向程序所在的包:
app = Flask(__name__)
- 装饰器的作用是将路由映射到视图函数index
@app.route('/')
def index():
return 'Hello World'
- Flask用用程序实例的run方法启动Web服务器
if __name__ == '__main__':
app.run()
- 在程序运行过程中,程序实例中会使用 url_map 将装饰器路由和视图的对应关系保存起来,打印结果如下图:
四、相关配置参数:
在上一节实现了一个最简单的 Flask 应用程序,只使用了7行代码,接来对 Flask 程序的创建,运行配置做进一步的了解,具体有:
- Flask 程序初始化参数
- Flask 程序相关配置加载方式
- app.run() 参数
1.初始化参数:
Flask 程序实例在创建的时候,需要默认传入当前 Flask 程序所指定的包(模块),接下来就来详细查看一下 Flask 应用程序在创建的时候一些需要我们关注的参数:
- import_name
- Flask程序所在的包(模块),传 name 就可以
- 其可以决定 Flask 在访问静态文件时查找的路径
- static_path
- 静态文件访问路径(不推荐使用,使用 static_url_path 代替)
- static_url_path
- 静态文件访问路径,可以不传,默认为:/ + static_folder
- static_folder
- 静态文件存储的文件夹,可以不传,默认为 static
- template_folder
- 模板文件存储的文件夹,可以不传,默认为 templates
2.程序加载配置:
在 Flask 程序运行的时候,可以给 Flask 设置相关配置,比如:配置 Debug 模式,配置数据库连接地址等等,设置 Flask 配置有以下三种方式:
- 从配置对象中加载(常用)
- app.config.from_object()
- 从配置文件中加载
- app.config.from_pyfile()
- 从环境变量中加载(了解)
- app.config.from_envvar()
以下演练以设置应用程序的 DEBUG(调试模式) 为例,设置应用为调式模式这后,可以实现以下功能:
1.程序代码修改后可以自动重启服务器
2.在服务器出现相关错误的时候可以直接将错误信息进行抛出到控制台打印
2.1 使用方式:
1)配置对象:
- 从配置对象中加载,创建配置的类,代码如下:
# 配置对象,里面定义需要给 APP 添加的一系列配置
class Config(object):
DEBUG = True
# 创建 Flask 类的对象,指向程序所在的包的名称
app = Flask(__name__)
# 从配置对象中加载配置
app.config.from_object(Config)
运行测试,在修改代码之后直接保存,会自动重启服务器
2) 配置文件:
- 创建配置文件 config.ini,在配置文件中添加配置
- 使用代码去加载配置:
# 创建 Flask 类的对象,指向程序所在的包的名称
app = Flask(__name__)
# 从配置文件中加载配置
app.config.from_pyfile('config.ini')
3) 环境变量(不常用):
- 编辑运行的相关配置
- 使用代码去加载配置:
# 创建 Flask 类的对象,指向程序所在的包的名称
app = Flask(__name__)
# 加载指定环境变量名称所对应的相关配置
app.config.from_envvar('FLASKCONFIG')
4) 读取配置:
- app.config.get()
- 在视图函数中使用 current_app.config.get()
注:Flask 应用程序将一些常用的配置设置成了应用程序对象的属性,也可以通过属性直接设置/获取某些配置:app.debug = True
3. app.run的参数
- 可以指定运行的主机IP地址,端口,是否开启调试模式
app.run(host="0.0.0.0", port=5000, debug = True)
五、路由基本定义:
1.指定路由地址:
# 指定访问路径为 demo1
@app.route('/demo1')
def demo1():
return 'demo1'
2.给路由传参示例:
有时我们需要将同一类 URL 映射到同一个视图函数处理,比如:使用同一个视图函数来显示不同用户的个人信息。
# 路由传递参数
@app.route('/user/<user_id>')
def user_info(user_id):
return 'hello %s' % user_id
- 路由传递的参数默认当做 string 处理,也可以指定参数的类型
# 路由传递参数
@app.route('/user/<int:user_id>')
def user_info(user_id):
return 'hello %d' % user_id
这里指定int,尖括号中的内容是动态的,在此暂时可以理解为接受 int 类型的值,实际上 int 代表使用 IntegerConverter 去处理 url 传入的参数
3.指定请求方式:
在 Flask 中,定义一个路由,默认的请求方式为:
- GET
- OPTIONS(自带)
- HEAD(自带)
如果想添加请求方试,那么可以如下指定:
@app.route('/demo2', methods=['GET', 'POST'])
def demo2():
# 直接从请求中取到请求方式并返回
return request.method
demo2 请求方式为:
4.使用 PostMan 对请求进行测试:
PostMan 是一款功能强大的网页调试与发送网页 HTTP 请求的 Chrome 插件,可以直接去对我们写出来的路由和视图函数进行调试,作为后端程序员是必须要知道的一个工具。
-
安装方式1:去 Chrome 商店直接搜索 PostMan 扩展程序进行安装
-
安装方式2:https://www.getpostman.com/ 官网下载桌面版
-
安装方式3:将已下载好的 PostMan 插件文件夹拖入到浏览器
- 打开 Chrome 的扩展程序页面,打开 开发者模式 选项
- 将插件文件夹拖入到浏览器(或者点击加载已解压的扩展程序选择文件夹)
- 在 Mac 下生成桌面图标,可以点击启动
- 在 ubuntu 旧版的 Chrome 浏览器中会显示以下效果,可以直接点击启动
- 打开 Chrome 的扩展程序页面,打开 开发者模式 选项
-
使用 PostMan,打开之后,会弹出注册页面,选择下方的 Skip this,go straight to the app 进行程序
六、视图常用逻辑
- 返回 JSON
- 重定向
- url_for
- 自定义状态
1.返回JSON:
在使用 Flask 写一个接口时候需要给客户端返回 JSON 数据,在 Flask 中可以直接使用 jsonify 生成一个 JSON 的响应
# 返回JSON
@app.route('/demo4')
def demo4():
json_dict = {
"user_id": 10,
"user_name": "laowang"
}
return jsonify(json_dict)
不推荐使用 json.dumps 转成 JSON 字符串直接返回,因为返回的数据要符合 HTTP 协议规范,如果是 JSON 需要指定 content-type:application/json
2 重定向:
- 重定向到百度 首页
# 重定向
@app.route('/demo5')
def demo5():
return redirect('http://www.baidu.com')
- 重定向到自己写的视图函数
- 可以直接填写自己 url 路径
- 也可以使用 url_for 生成指定视图函数所对应的 url
@app.route('/demo1')
def demo1():
return 'demo1'
# 重定向
@app.route('/demo5')
def demo5():
return redirect(url_for('demo1'))
重定向到带有参数的视图函数
在 url_for 函数中传入参数
# 路由传递参数
@app.route('/user/<int:user_id>')
def user_info(user_id):
return 'hello %d' % user_id
# 重定向
@app.route('/demo5')
def demo5():
# 使用 url_for 生成指定视图函数所对应的 url
return redirect(url_for('user_info', user_id=100))
3. 自定义状态码
- 在 Flask 中,可以很方便的返回自定义状态码,以实现不符合 http 协议的状态码,例如:status code: 666
@app.route('/demo6')
def demo6():
return '状态码为 666', 666
七、正则匹配路由
在 web 开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,根据自己的规则去限定请求参数再进行访问
具体实现步骤为:
- 导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录
- 自定义转换器:自定义类继承于转换器基类
- 添加转换器到默认的转换器字典中
- 使用自定义转换器实现自定义匹配规则
1.代码实现
- 导入转换器基类
from werkzeug.routing import BaseConverter
- 自定义转换器
# 自定义正则转换器
class RegexConverter(BaseConverter):
def __init__(self, url_map, *args):
super(RegexConverter, self).__init__(url_map)
# 将接受的第1个参数当作匹配规则进行保存
self.regex = args[0]
- 添加转换器到默认的转换器字典中,并指定转换器使用时名字为: re
app = Flask(__name__)
# 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: re
app.url_map.converters['re'] = RegexConverter
- 使用转换器去实现自定义匹配规则
- 当前此处定义的规则是:3位数字
@app.route('/user/<re("[0-9]{3}"):user_id>')
def user_info(user_id):
return "user_id 为 %s" % user_id
运行测试:http://127.0.0.1:5000/user/123 ,如果访问的url不符合规则,会提示找不到页面
2.系统自带转换器:
DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
}
系统自带的转换器具体使用方式在每种转换器的注释代码中有写,请留意每种转换器初始化的参数。