一、介绍
flask只有一个内核,其WSGI工具箱采用Werkzeug(路由模块),模板引擎使用Jinja2。其他几乎所有功能都要用第三方扩展来实现。
二、常用扩展包
扩展列表:http://flask.pocoo.org/extensions/
- 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://docs.jinkan.org/docs/flask/)
三、环境安装
1、安装虚拟环境和pip的命令(需要联网)
# 虚拟环境
mkvirtualenv # 创建虚拟环境
rmvirtualenv # 删除虚拟环境
workon # 进入虚拟环境、查看所有虚拟环境
deactivate # 退出虚拟环境
# pip
pip install # 安装依赖包
pip uninstall # 卸载依赖包
pip list # 查看已安装的依赖包
pip freeze # 冻结当前环境的依赖包
# 自己需要备的步骤
mkvirtualenv flask -p python3 # 安装flask
pip install flask # 安装flask
四、创建第一个最简单的Flask程序
# 创建一个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()
手动启动命令:python helloworld.py,pycharm和正常运行普通python程序一样即可。
五、Flask对象初始化参数
import_name 传 __name__ 即可,决定 Flask 在访问静态文件时查找的路径。
static_url_path 静态文件访问路径,可以不传,默认为: / + static_folder
static_folder 静态文件存储的文件夹,可以不传,默认为 static
# 修改参数的情况下 app = Flask(__name__, static_url_path="/url_path", static_folder="folder_param") # 文件目录 ---- |---folder_param # 此处目录名变化 | |--- 1.png # static下存储的图片 |---helloworld.py # 主程序入口
通过访问 127.0.0.1:5000/url_path/1.png 才能访问到图片
六、应用程序配置参数
1、对于Flask对象初始化参数仅仅设置的是Flask本身的属性,比如:
- Flask从哪里读取静态文件
- Flask从哪里读取模板文件
- ...等等。
2、应用程序配置参数设置的是一个Web应用工程的相关信息,比如:
- 数据库的连接信息
- 日志的配置信息
- 自定义的配置信息
- ...等等
Flask将配置信息保存到了 app.config 属性中,该属性可以按照字典类型进行操作。
3、读取
app.config.get(name)
app.config[name]
4、设置,主要使用三种方式:
①从配置对象(设置一个类,将配置信息写进去)中加载,用 app.config.from_object(配置对象) 加载,好处:可以继承,但是信息不安全
②从配置文件(将配置信息写入到一个单独的setting.py文件)中加载,用 app.config.from_pyfile(配置文件的路径)
③从环境变量中加载,Flask使用环境变量加载配置的本质是通过环境变量值找到配置文件,再读取配置文件的信息,用 app.config.from_envvar("环境变量名", silent=True) # 环境变量名是配置文件的绝对路径,silent是boolean值,默认为False表示没值时报错,设置为True表示没值时也让运行下去。
在 linux中命令设置环境变量
export 变量名=变量值 # 设置
echo $变量名 # 赢取
在windows中命令设置环境变量
set 变量名=变量值 # 设置
echo %变量名% # 读取
④Pycharm运行时设置环境变量,如下图:
⑤项目中推荐:先使用配置对象加载默认配置,后使用环境加载不想出现在代码中的敏感配置信息,两个搭配使用。如下
from flask import Flask def create_flask_app(config): """ 创建Flask作用 :param: config: 配置对象 :return: Flask应用 """ app = Flask(__name__) app.config.from_object(config) # 从环境变量指向的配置文件中读取的配置信息会覆盖掉从配置对象中加载的同名参数 app.config.from_envvar("环境变量名", silent=True) return app class DefaultConfig(object): # 默认配置 SECRET_KEY = "learn" class DevelopmentConfig(DefaultConfig): DEBUG = True app = create_flask_app(DevelopmentConfig) @app.route("/") def index(): app.config.get("SECRET_KEY ") return "helloworld" if __name__ == "__main__": app.run() # 运行程序后会显示 learn
5、app.run参数
可以指定运行的主机IP地址,端口,是否开启调试模式
app.run(host="0.0.0.0", port=5000, debug=True)
6、DEBUG模式开启的作用
①程序代码修改后可以自动重启服务器
②在服务器出现相关错误的时候可以直接将错误信息返回到前端进行展示
七、开发服务器启动方式
在1.0后期的版本中,调整了启动方式,由代码编写 app.run() 语句调整为命令 flask run启动,程序中不用在写app.run()
1、终端启动
①在linux中:
export FLASK_APP=要运行的模块名
②在windows中:
set FLASK_APP=要运行的模块名
③flask run -h 0.0.0.0 -p 8000 # 可以指定主机IP和端口运行程序
④生产者与开发者的控制
linux中:
export FLASK_ENV=production # 运行在生成模式(默认模式)
export FLASK_ENV=development # 运行在开发调试模式
windows中:
set FLASK_ENV=production # 运行在生成模式(默认模式)
set FLASK_ENV=development # 运行在开发调试模式
八、在Pycharm启动
设置环境变量
旧版本Pycharm设置
九、路由
1、查询路由
①命令行方式: flask routes
②在程序中获取: print(app.url_map)
# 通过访问 / 地址,以json的方式返回应用内的所有路由信息 @app.route("/") def route_map(): """ 主视图,返回所有视图网址 """ rules_iterator = app.url_map.iter_rules() return json.dumps({rule.endpoint:rule.rule for rule in rules_iterator})
2、请求指定方式
在Flask中,请求方式默认为GET、OPTIONS、HEAD三种方式,利用 methods 自定义接口的请求方式:
@app.route("/learn", methods=["GET","POST"]) def view_func(): return "hello_world"
十、蓝图
在Flask中,使用蓝图Blueprint来分模块组织管理。
1、使用蓝图可以分为三个步骤
# 创建一个蓝图对象 user_bp = Blueprint("user", __name__) # 在这个蓝图对象上进行操作,注册路由,指定静态文件夹,注册横版过滤器 @user_bp.route("/") def user_profile(): return "user_profile" # 在应用对象上注册这个蓝图对象 app.register_blueprint(user_bp)
2、单文件蓝图
可以将创建蓝图对象与定义视图放到一个文件中
3、目录(包)蓝图
对于一个打算包含多个文件的蓝图,通常将创建蓝图对象放到Python包的__init__.py
文件中,如下图
3、扩展用法
①指定蓝图的 url 前缀
在应用中注册蓝图时使用 url_prefix 参数指定
app.register_blueprint(user_bp, url_prefix="/user")
app.register_blueprint(goods_bp, url_prefix="/goods")
②蓝图内部静态文件。蓝图没有默认静态目录,需要我们在创建时指定static_folder参数,如:
admin = Blueprint("admin", __name__, static_folder="static_admin")
app.register_blueprint(admin, url_prefix="/admin")
上面定义后,使用 /admin/static_admin/<filename> 访问 static_admin 目录下的静态文件了。
4、蓝图内部模板目录
蓝图对象默认的模板目录为系统的模版目录,可以在创建蓝图对象时使用 template_folder 关键字参数设置模版目录,如下
admin = Blueprint("user", __name__, static_folder="my_statics", template_folder="my_templates")