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-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. Hello Flask
# 导入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
2. 配置文件
app.config.get(name)
app.config[name]
主要使用以下三种方式:
-
从配置对象中加载
app.config.from_object(配置对象)
class DefaultConfig(object): """默认配置""" SECRET_KEY = ‘TPmi4aLWRbyVq8zu9v82dWYW1‘ app = Flask(__name__) app.config.from_object(DefaultConfig) @app.route("/") def index(): print(app.config[‘SECRET_KEY‘]) return "hello world"
class DevelopmentConfig(DefaultConfig): DEBUG=True
-
从配置文件中加载
app.config.from_pyfile(配置文件)
新建一个配置文件setting.py
SECRET_KEY = ‘TPmi4aLWRbyVq8zu9v82dWYW1‘
在Flask程序文件中
app = Flask(__name__) app.config.from_pyfile(‘setting.py‘) @app.route("/") def index(): print(app.config[‘SECRET_KEY‘]) return "hello world"
Flask使用环境变量加载配置的本质是通过环境变量值找到配置文件,再读取配置文件的信息,其使用方式为
app.config.from_envvar(‘环境变量名‘)
关于
silent
的说明:表示系统环境变量中没有设置相应值时是否抛出异常
- False 表示不安静的处理,没有值时报错通知,默认为False
- True 表示安静的处理,即时没有值也让Flask正常的运行下去
应用场景:
配置文件的地址不固定;
在代码中不想暴露真实的配置文件地址,只在运行代码的服务器上才有真实配置文件的信息。
项目中的常用方式
使用工厂模式创建Flask app,并结合使用配置对象与环境变量加载配置
- 使用配置对象加载默认配置
- 使用环境变量加载不想出现在代码中的敏感配置信息
def create_flask_app(config):
"""
创建Flask应用
:param config: 配置对象
:return: Flask应用
"""
app = Flask(__name__)
app.config.from_object(config)
# 从环境变量指向的配置文件中读取的配置信息会覆盖掉从配置对象中加载的同名参数
app.config.from_envvar("PROJECT_SETTING", silent=True)
return app
class DefaultConfig(object):
"""默认配置"""
SECRET_KEY = ‘itcast1‘
class DevelopmentConfig(DefaultConfig):
DEBUG=True
# app = create_flask_app(DefaultConfig)
app = create_flask_app(DevelopmentConfig)
@app.route("/")
def index():
print(app.config[‘SECRET_KEY‘])
return "hello world"
3. app.run 参数
可以指定运行的主机IP地址,端口,是否开启调试模式
app.run(host="0.0.0.0", port=5000, debug = True)
关于DEBUG调试模式
- 程序代码修改后可以自动重启服务器
- 在服务器出现相关错误的时候可以直接将错误信息返回到前端进行展示
4. HTTP
1. 请求
2. 响应
3. 上下文
- 程序上下文
- current_app
- g
- 请求上下文
- request
- Session
- 上下文钩子teardown_appcontext
4. 应用
-
返回上一个页面
redirect
-
HTTP referrer
-
查询参数
next = request.full_path
-
结合二者
def redirect_back(defualt=‘Login‘, **kwargs): for target in request.args.get(‘next‘), request.referrer: if target: return redirect(url_for(target)) return redirect(url_for(defualt, **kwargs))
-
安全性
-
-
web安全防范
- 注入攻击
- xss攻击
- CSRF攻击
3. 表单
1. 处理表单
2. Flask-wtf
4. 数据库
1. ORM
2. Flask-SQLAlchemy
5. 性能优化
Url_for
Make_response()
Abort()
Jsonify()
Set_cookie()
App.secret_key=‘asdasdas‘
Session[‘login_in‘] = True
重定向到上一个界面
(1)HTTP referer
Request.referrer
(2)查询参数
next = request.full_path
安全防范
- 注入攻击
- x s s攻击
- CSRF攻击
验证器
db.create_all
Flask_login
Loginmanager()
UserMixin