Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架。
Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login,数据库Flask-SQLAlchemy),都需要用第三方的扩展来实现。比如可以用 Flask 扩展加入ORM、窗体验证工具,文件上传、身份验证等。Flask 没有默认使用的数据库,你可以选择 MySQL,也可以用 NoSQL。
其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是 Flask 框架的核心。
最新版本 1.0.2
2.1 flask与django哪个框架好?
2.2 Flask与Django对比
django提供了:
而这些,flask都没有,都需要扩展包来提供
拓展包列表
mkvirtualenv flask - p python3
workon # 进入虚拟环境、查看所有虚拟环境
deactivate # 退出虚拟环境
pip install flask
创建helloworld.py文件
# 导入Flask类
from flask import Flask
# Flask类接收一个参数__name__
app = Flask(__name__)
# 装饰器的作用是将路由映射到视图函数index
@app.route("/")
def index():
return "Hello World"
# flask应用程序实例的run方法启动服务器
if __name__ == "__main__":
app.run()
启动运行
python helloworld.py
3.1 Flask对象初始化参数
__name__
就可以/ + static_folder
static
templates
修改参数示例:
app = Flask(__name__, static_url_path="/s", static_folder="folder")
3.2 应用程序配置参数
app.config
属性中,该属性可以按照字典类型进行操作。app.config.from_object(配置对象)
app.config.from_pyfile(配置文件)
app.config.from_envvar(环境变量名)
代码示例:
from flask import Flask
class DefaultConfig(object):
"""默认配置"""
SECRET_KEY = "HNhidiwi3442ojnko"
app = Flask(__name__)
app.config.from_object(DefaultConfig)
@app.route("/")
def index():
print(app.config["SECRET_KEY"])
return app.config["SECRET_KEY"]
if __name__ == '__main__':
app.run()
示例代码:
新建一个配置文件setting.py
SECRET_KEY = "123fefeifidwhhdho;"
from flask import Flask
app = Flask(__name__)
app.config.from_pyfile("settings.py")
@app.route("/")
def index():
print(app.config["SECRET_KEY"])
return app.config["SECRET_KEY"]
if __name__ == '__main__':
app.run()
在linux系统中设置和读取环境变量的方式如下:
export 变量名=变量值 # 设置
echo $变量名 # 读取
flask使用环境变量加载配置的本质是通过环境变量值找到配置文件,再读取配置文件的信息。
环境变量的值为配置文件的绝对路径
代码示例:
在终端中执行如下命令,定义环境变量
export PROJECT_SETTING = "~/setting.py"
from flask import Flask
app = Flask(__name__)
app.config.from_envvar("PROJECT_SETTING", silent=True)
@app.route("/")
def index():
print(app.config["SECRET_KEY"])
return app.config["SECRET_KEY"]
if __name__ == '__main__':
app.run()
关于silent的说明:
表示系统环境变量中没有设置相应值时是否抛出异常
总结:三种设置参数方式优缺点
优点 | 缺点 | |
---|---|---|
配置对象中加载 | 可以继承、复用 | 敏感数据暴露 |
配置文件中加载 | 独立文件,保护敏感数据 | 不能继承,文件路径固定,不灵活 |
环境变量中加载 | 独立文件,保护敏感数据;文件路径不固定,灵活 | 不方便操作,要设置环境变量 |
from flask import Flask
def create_flask_app(config):
"""
创建flask应用
:return:
"""
app = Flask(__name__)
app.config.from_object(config)
# 从环境变量指向的配置文件中读取的配置信息会覆盖掉从配置对象中加载的同名参数
app.config.from_envvar("PROJECT_SETTING", silent=True)
return app
class DefaultConfig(object):
"""默认配置"""
SECRET_KEY = "123QWWDEFGG,"
class DevelopmentConfig(DefaultConfig):
DEBUG = True
app = create_flask_app(DevelopmentConfig)
@app.route("/")
def index():
print(app.config.get("SECRET_KEY"))
return "hello world"
if __name__ == '__main__':
app.run()
3.3 app.run()运行参数
可以指定运行的主机ip地址,端口,是否开启调试模式
app.run(host='0.0.0.0', post='5000', debug=True)
关于DEBUG调试模式:
在1.0版本之后,Flask调整了开发服务器的启动方式,由代码编写app.run()
语句调整为命令flask run
启动。
4.1 终端启动
Linux
export FLASK_APP=文件名
flask run
windows
set FLASK_APP=文件名
flask run
说明:
flask run -h 0.0.0.0 -p 8000
绑定地址端口flask run --help
获取帮助FLASK_ENV
环境变量指明
export FLASK_ENV=production
运行在生产模式,默认此方式export FLASK_ENV=development
运行在开发模式1.1 查询路由信息
flask routes
print(app.url_map)
遍历路由信息
for rule in app.url_map.iter_rules():
print("name={} path={}".format(rule.endpoint, rule.rule))
需求:通过访问 / 地址,以json的方式返回应用内的所有路由信息
from flask import Flask
import json
app = Flask(__name__)
@app.route("/")
def index():
"""
返回所有视图url
:return:
"""
rules_iterator = app.url_map.iter_rules()
return json.dumps(
{
rule.endpoint: rule.rule for rule in rules_iterator
}
)
if __name__ == '__main__':
app.run()
1.2 指定请求方式
在Flask中,定义路由其默认的请求方式为:
利用methods
参数指定一个接口的请求方式
@app.route("/users", methods=["POST"])
def index()
return "hello world"
在Flask中,使用蓝图Blueprint来分模块组织管理。
蓝图可以理解为是一个存储一组视图方法的容器对象,具有如下特点:
但是一个Blueprint并不是一个完整的应用,它不能独立于应用运行,而必须要注册到某一个应用中。