1.Flask简介
Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架。
Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login,数据库Flask-SQLAlchemy),都需要用第三方的扩展来实现。比如可以用 Flask 扩展加入ORM、窗体验证工具,文件上传、身份验证等。Flask 没有默认使用的数据库,你可以选择 MySQL,也可以用 NoSQL。
其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是 Flask 框架的核心。
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:简单而可扩展的管理接口的框架
2.相关配置参数
运行配置,具体有:
- Flask 程序初始化参数
- Flask 程序相关配置加载方式
- app.run() 参数
Flask 程序实例在创建的时候,需要默认传入当前 Flask 程序所指定的包(模块),接下来就来详细查看一下 Flask 应用程序在创建的时候一些需要我们关注的参数:
比如 : app=Flask(__name__,static_url_path='/文件路径')
- import_name
- 第一个参数可以传任意字符串(python内置模块除外),如果传入的是任意字符串,python会把这个字符串当作模块进行路径查找,如果查找不到,就会返回当前模块的路径,然而在当前模块同级目录下的静态文件或者模板文件就会被访问到。
- Flask程序所在的包(模块),传
__name__
就可以 - 其可以决定 Flask 在访问静态文件时查找的路径
- static_path
- 静态文件访问路径(不推荐使用,使用 static_url_path 代替)
- static_url_path
- 静态文件访问路径,可以不传,默认为:
/ + static_folder
- 静态文件访问路径,可以不传,默认为:
- static_folder
- 静态文件存储的文件夹,可以不传,默认为
static
- 静态文件存储的文件夹,可以不传,默认为
- template_folder
- 模板文件存储的文件夹,可以不传,默认为
templates
- 模板文件存储的文件夹,可以不传,默认为
1.程序加载配置
在 Flask 程序运行的时候,可以给 Flask 设置相关配置,比如:配置 Debug 模式,配置数据库连接地址等等,设置 Flask 配置有以下三种方式: (在helloword案列中有示例)
- 从配置对象中加载(常用)
- app.config.from_object()
- 从配置文件中加载
- app.config.from_pyfile()
- 从环境变量中加载(了解)
- app.config.from_envvar()
以下演练以设置应用程序的 DEBUG(调试模式) 为例,设置应用为调式模式这后,可以实现以下功能:
- 程序代码修改后可以自动重启服务器
- 在服务器出现相关错误的时候可以直接将错误信息进行抛出到控制台打印
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. 环境变量(了解)
- 编辑运行的相关配置
在pycharm中配置
- 使用代码去加载配置
# 创建 Flask 类的对象,指向程序所在的包的名称
app = Flask(__name__)
# 加载指定环境变量名称所对应的相关配置
app.config.from_envvar('FLASKCONFIG')
2. 读取配置
- app.config.get()
- 在视图函数中使用 current_app.config.get()
注:Flask 应用程序将一些常用的配置设置成了应用程序对象的属性,也可以通过属性直接设置/获取某些配置:app.debug = True
2. app.run的参数
- 可以指定运行的主机IP地址,端口,是否开启调试模式
app.run(host="0.0.0.0", port=5000, debug = True)
注:"0.0.0.0"称之为万能ip,如果你即想通过本地循环地址访问又想通过内网ip进行访问,需要设置host=“0.0.0.0”
3. hello word
# helloword.py文件
# 导入Flask
from flask import Flask
# 创建Flask的应用程序
# 第一个参数指代Flask所对应的模板,其可以决定静态文件从哪个位置开始找
app = Flask(__name__,
# static_path='/static', # 表示静态文件访问的路径
static_url_path='/python27',
static_folder='static', # 表示静态文件所存放在目录,默认值是 static
template_folder='templates' # 表示模板文件存放的目录
)
# =====从对象中加载配置======= #
# class Config(object):
# DEBUG = True
# app.config.from_object(Config)
# =====从文件中加载配置======= #
# app.config.from_pyfile('config.ini')
# =====从环境变量中加载配置==== #
# 了解即可
# app.config.from_envvar('ENVCONFIG')
# 一些常用的配置,可以直接通过app.的形式设置
app.debug = True
app.config['DEBUG'] = True
# 使用装饰器路由去与视图函数进行关联
@app.route('/')
def index():
print(app.config['DEBUG'])
return 'hello world222222'
if __name__ == '__main__':
# 运行当前Flask应用程序,设置端口
app.run(port=8888, debug=True)
4. 路由基本定义
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
5. 视图常用逻辑
- 返回 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数据,但是响应头的Content-Type为text/html。
@app.route('/demo4')
def demo4():
json_dict = {
"user_id": 10,
"user_name": "laowang"
}
# 将字典类型转化为json字符串类型
json_str = json.dumps(json_dict)
# 将json字符串类型转化为字典类型
# json_dict1 = json.loads('{ "user_id": 10, "user_name": "laowang"}')
return json_str
不推荐使用 json.dumps 转成 JSON 字符串直接返回,因为返回的数据要符合 HTTP 协议规范,如果是 JSON 需要指定 content-type:application/json
2. 重定向
1.重定向到某网站
- 重定向到 python 官网
# 重定向
@app.route('/demo5')
def demo5():
return redirect('http://www.python.com')
2.重定向到某个视图
- 重定向到自己写的视图函数
- 可以直接填写自己 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