flask介绍
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框架的核心
1.1 为什么要学Flask
2019 python官方年度调查报告显示Flask与Django为Python Web开发使用最主要的两个框架
1.2 框架对比
重量级的框架:为方便业务程序的开发,提供了丰富的工具,组件,如 Django
轻量级的框架:只提供Web框架的核心功能,自由、灵活、高度定制,如 Flask,Tornado
1.3 常用扩展包
扩展列表: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:简单而可扩展的管理接口的框架
1.4 Flask文档
1.中文文档:https://dormousehole.readthedocs.io/en/latest/
2.英文文档:https://flask.palletsprojects.com/en/1.1.x/
2.第一个Flask
2.1 安装环境
创建虚拟环境
mkvirtualenv flask
安装Flask
pip install flask
2.2 创建项目
2.3 参数说明
接下来就想写查看一下flask应用程序在创建的时候一些需要我们关注的参数
import_name
Flask程序所在的包(模块),传__name__就可以
其可以决定flask在访问静态文件时查找的路径
static_url_path
静态文件访问路径,可以不传,默认为: / + static_folder
static_folder
静态文件存储的文件夹,可以不传,默认为static
template_folder
默认文件存储的文件夹,可以不传,默认为templates
默认参数情况下
app=Flask(__name__)
|---static
|---1.png
|---templates
|---ndex.html
|---helloworld.py
访问127.0.0.1:80/1.png就可以访问到图片
修改参数的情况下
app=Flask(__name__,static_url_path='/url_path_param',static_folder='folder_param')
----
|--- folder_param #此处目录名变化
|---1.png
|---helloworld.py
访问127.0.0.1:80/url_path_param/1.png才可以访问到图片
app.run参数
可以指定运行的主机IP 地址,端口,是否开启调试模式
app.run(host="0.0.0.0",port=8080,debug=Ture)
IP:0.0.0.0 代表当前计算机所有的IP地址
关于DEBUG调试模式
- 程序代码修改后可以自动重启非完全
- 在服务器出现相关错误的时候可以直接将错误信息返回到前端进行展示
2.4 应用程序配置参数
应用程序配置参数设置的是一个web应用工程的相关信息,比如:
- 数据库的连接信息
- 日志的配置信息
- 自定义的配置信息
- ...
注意:这样可以集中管理项目的所有配置信息
Flask将配置信息保存到了app.config属性中,该属性可以安装字典类型进行操作
2.4.1 从配置对象中加载
1 from flask import Flask 2 3 #web项目的常量配置对象 4 class DefaultConfig(object): 5 '''默认Web项目的配置''' 6 USER='root' 7 PWD='123123' 8 9 server=Flask(__name__) 10 11 server.config.from_object(DefaultConfig) 12 13 @server.route('/') 14 def index(): 15 print(server.config['USER']) 16 print(server.config['PWD']) 17 return "hello world" 18 19 if __name__ == '__main__': 20 server.run(host='0.0.0.0')
这样的好处是可以在项目开发中来继承:
class MyDevelopmentConfig(DefaultConfig): Debug=True
2.4.2 从配置文件中加载
1 #setting.py 2 3 #web项目整个配置文件 4 USER='admin' 5 PWD='123456'
1 from flask import Flask 2 3 #web项目的常量配置对象 4 class DefaultConfig(object): 5 '''默认Web项目的配置''' 6 USER='root' 7 PWD='123123' 8 9 server=Flask(__name__) 10 11 server.config.from_pyfile('setting.py') 12 13 @server.route('/') 14 def index(): 15 print(server.config['USER']) 16 print(server.config['PWD']) 17 return "hello world" 18 19 if __name__ == '__main__': 20 server.run(host='0.0.0.0')
2.4.3 从环境变量中加载
Flask使用环境变量加载配置的本质是通过环境变量值找到配置文件,再读取配置文件的信息,其使用方式为:
server.config.from_envvar('环境变量名')
环境变量的值为配置文件的绝对路径
from flask import Flask #web项目的常量配置对象 class DefaultConfig(object): '''默认Web项目的配置''' USER='root' PWD='123123' server=Flask(__name__) server.config.from_envvar('SETTING_PATH',silent=True) #在企业正式运行的情况下:silent选择True @server.route('/') def index(): print(server.config['USER']) print(server.config['PWD']) return "hello world" if __name__ == '__main__': server.run(host='0.0.0.0')
silent参数:
- Flase 表示不安静的处理,没有值时保存通知,默认为Flase
- True 表示安静的处理,即使没有值也让Flask正常的运行下下去
2.4.4 pycharm中的运行时设置环境变量的方式加载
使用非常少
2.4.5 企业项目开发常用的方式
使用工厂模式创建Flask app,并结合使用配置对象与环境变量加载配置
- 使用配置对象加载默认配置
- 使用环境变量加载不想出现在代码中的敏感配置信息
1 from flask import Flask 2 3 def create_flask_app(config): 4 ''' 5 创建Flask应用 6 :param config: 配置对象 7 :return: Flask应用 8 ''' 9 app=Flask(__name__) 10 app.config.from_object(config) 11 12 #从环境变量指向的配置文件中读取的配置信息会覆盖掉从配置对象中加载的同名参数 13 app.config.from_envvar("PROJECT_SETTING",silent=True) 14 return app 15 16 class DefaultConfig(object): 17 '''默认配置''' 18 USER='ROOT' 19 20 class DevelopmentConfig(DefaultConfig): 21 DEBUG=True 22 23 #app=create_flask_app(DefaultConfig) 24 app=create_flask_app(DevelopmentConfig) 25 #server.config.from_envvar('SETTING_PATH',silent=True) 26 27 @server.route('/') 28 def index(): 29 print(server.config['USER']) 30 print(server.config['PWD']) 31 return "hello world" 32 33 if __name__ == '__main__': 34 server.run(host='0.0.0.0')