目录
前言
Flask 是一个使用 Python 语言编写的 Web 框架,它可以让你高效的编写 Web 程序。
Flask 是典型的微框架,作为 Web 框架来说,它仅保留了核心功能:请求响应处理和模板渲染。这两类功能分别由 Werkzeug(WSGI 工具库)完成和 Jinja(模板渲染库)完成,因为 Flask 包装了这两个依赖
推荐这本电子书作为入门教程 :Flask 入门教程 - HelloFlask ,也有一些内容直接引用的这里
个人喜欢多个文档对照看,所以还有一个教程: 欢迎进入Flask大型教程项目! — flask mega-tutorial 1.1 documentation
官网教程: Welcome to Flask — Flask Documentation (2.0.x)
flask一些插件教程: Python 中文学习大本营
一、配置处理
为了设置 Flask、扩展或是我们程序本身的一些行为,我们需要设置和定义一些配置变量。Flask 提供了一个统一的接口来写入和获取这些配置变量:Flask.config
字典。配置变量的名称必须使用大写,写入配置的语句一般会放到扩展类实例化语句之前。
1. 内置配置值
Flask有两个配置值比较特殊: ENV 和 DEBUG, 这两个值要在应用启动前配置,启动后再进行配置的话,配置值会改变但实际上不会生效。
ENV : [ 'development', 'production'] , 默认值 : 'production'
这个值指定运行模式。
Flask官网特别指出生成环境下不要用 'development'模式
DEBUG: ['True', 'False'], 如果 ENV 为'development'
就是 True
,否则为 False
。
这个值指 是否启用调试模式。
Flask官网特别指出生成环境下不要设置 DEBUG =True
ENV 使用环境变量 FLASK_ENV 来设置,
DEBUG 使用环境变量FLASK_DEBUG来设置,
DEBUG 的值跟随 ENV 而改变, 一般不用特别设置
Bash
$ export FLASK_ENV=development
$ flask run
Fish
$ set -x FLASK_ENV development
$ flask run
CMD
> set FLASK_ENV=development
> flask run
Powershell
> $env:FLASK_ENV = "development"
> flask run
FLASK_ENV = "development" 代表 ENV = "development", DEBUG =True,
FLASK_ENV默认为"production",代表 ENV = "production", DEBUG =False,
其他配置值详见官网: Configuration Handling — Flask Documentation (2.0.x)
2.配置方式
配置方式有python文件配置,文件配置,环境变量配置等,这里介绍python文件配置
python文件配置
config包下config.py:
TEST_VALUE1 = 'config1'
TEST_VALUE2 = 'config2'
app.py
app = Flask(__name__)
app.config.from_object('config.config')
print(app.config)
<Config {'ENV': 'development', 'DEBUG': False, 'TESTING': False,....
TEST_VALUE1 = 'config1',
TEST_VALUE2 = 'config2'
}>
官方推荐
这是官方文档上的最佳实践,
在上面的基础上再新建一个配置文件(文件名和路径任意):
D:\git_project\graphcompute\config3.py:
TEST_VALUE2 = 'config33'
app.py:
app = Flask(__name__)
app.config.from_object('config.config')
app.config.from_envvar('MYRAPPLICATION_SETTINGS')
print(app.config)
设置环境变量再启动(环境变量名任意, 代码中指定就行) :
$env:MYRAPPLICATION_SETTINGS='D:\git_project\graphcompute\config3.py'
flask run
首先会从config包下config.py读取配置值:
TEST_VALUE1 = 'config1'
TEST_VALUE2 = 'config2'
然后会找到环境变量MYRAPPLICATION_SETTINGS,根据指定的文件再读取配置值:
TEST_VALUE2 = 'config33'
会覆盖掉同名变量值:
print(app.config)
<Config {'ENV': 'development', 'DEBUG': False, 'TESTING': False,....
TEST_VALUE1 = 'config1',
TEST_VALUE2 = 'config33'
}>
通过这种方法,在不同的环境可以根据环境变量的不同指定不同的配置文件
类配置
还有个类配置也是官方文档上的最佳实践
class Config(object):
TESTING = False
class ProductionConfig(Config):
DATABASE_URI = 'mysql://user@localhost/foo'
class DevelopmentConfig(Config):
DATABASE_URI = "sqlite:tmp/foo.db"
class TestingConfig(Config):
DATABASE_URI = 'sqlite:///:memory:'
TESTING = True
要启用这样的配置,调用 from_object():
app.config.from_object('configmodule.ProductionConfig')
注意: from_object()不会去实例化对象。
如果需要实例化类(例如访问属性),则必须在调用 from_object() 之前执行此操作:
from configmodule import ProductionConfig
app.config.from_object(ProductionConfig())
详见官方文档
二、数据库使用
为了简化数据库操作,使用 SQLAlchemy——一个 Python 数据库工具(ORM,即对象关系映射)。借助 SQLAlchemy,可以通过定义 Python 类来表示数据库里的一张表(类属性表示表中的字段 / 列),通过对这个类进行各种操作来代替写 SQL 语句。这个类我们称之为模型类,类中的属性我们将称之为字段。
Flask 有大量的第三方扩展,这些扩展可以简化和第三方库的集成工作。使用 Flask-SQLAlchemy 的官方扩展来集成 SQLAlchemy。
pip install flask-sqlalchemy
app.py:数据库配置
import os
import sys
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
WIN = sys.platform.startswith('win')
if WIN: # 如果是 Windows 系统,使用三个斜线
prefix = 'sqlite:///'
else: # 否则使用四个斜线
prefix = 'sqlite:'
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = prefix + os.path.join(app.root_path, 'data.db')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 关闭对模型修改的监控
# 在扩展类实例化前加载配置
db = SQLAlchemy(app)
SQLAlchemy(app) 会自动在app.config中读取所需的配置信息,
所以也可以通过上一节的配置文件加载配置:
config.config.py:
SQLALCHEMY_DATABASE_URI = 'postgresql+psycopg2://username:password@host:5432/msda'
SQLALCHEMY_POOL_SIZE = 3
SQLALCHEMY_POOL_RECYCLE = 900
app.py:
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config.from_object('config.config')
db = SQLAlchemy(app)
#或者
app = Flask(__name__)
app.config.from_object('config.config')
db = SQLAlchemy()
ab.init_app(app)
sql执行:
result = db.session.execute("select * from table where category = :par_1", {'par_1': 'xxx'})
print(result.fetchall()[0]['colum_name'])
sql对应文档:
Working with Transactions and the DBAPI — SQLAlchemy 1.4 Documentation
问题:
使用 postgresql 的时候,无法指定 schema, 在 SQLALCHEMY_DATABASE_URI 末尾添加
'?search_path=xxx' 提示没有这个选项。
所以如果使用 sql查询数据需要在表名前面添加 schema名:
select * from schema.table
如果使用了模型类,需要在类中指明 schema:
class AnalyseUsers(db.Model):
# __tablename__ = 'analyse_users' 表名,可以不指定,自动解析类名
# 指定 schema
__table_args__ = {
'schema': 'msdap-etl'
}
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(255)) # 用户名
password = db.Column(db.String(255)) # 密码
三、蓝图使用
蓝图是一种组织一组相关视图和其他代码的方式。简单点说就是把一组接口统一管理。
1.创建蓝图
test_blueprint.py
from flask import Blueprint
from other_mode import get_data
# 蓝图对象
testapi= Blueprint('testapi', __name__, url_prefix='/testapi')
# 这个蓝图的接口定义一:
testapi.route('/', methods=['GET'])(index)
testapi.route('/show/get_data', methods=['GET'])(get_data)
# 这个蓝图的接口定义二:
@testapi.route('/show/get_data2', methods=['GET'])
def register():
...
...
2.注册蓝图
app.py
from test_blueprint import testapi
app = Flask(__name__)
app.register_blueprint(testapi)
注册完成后,调用接口 localhos:5000/testapi/ 就是调用 蓝图testapi中第一个接口,
调用接口localhos:5000/testapi/show/get_data 就是调用 蓝图testapi中第二个接口。
简单的说就是在蓝图testapi 的所有接口前加上了testapi 的 url_prefix 作为前缀。
四、启动
1.命令行启动
环境 | 命令 |
---|---|
Bash | $ export FLASK_APP=app $ flask run |
Fish | $ set -x FLASK_APP app $ flask run |
CMD | > set FLASK_APP=app > flask run |
Powershell | > $env:FLASK_APP = "app" > flask run |
设置 FLASK_APP
环境变量来告诉终端要使用的应用程序, 我这里使用的文件是 app.py, 所以设置 FLASK_APP=app。- 文件名为 app.py 或者wsgi.py, 其实是不用设置
FLASK_APP
环境变量的,会自动查找 - 如果启动文件使用的是 __init__.py,
FLASK_APP=pack_name (
__init__.py 所在的包名)
2.指定python解释器
直接使用 flask 命令是使用默认python解释器
如果需要用不同的python解释器去执行的话, 用 python -m flask 命令
例如我新下载了一个Anaconda3的解释器:
# 先移动到项目目录
cd xxx_project
# 执行命令
D:\work\Anaconda3\python.exe -m flask run
3.指定外部可见
默认运行服务器之后,只能从自己的计算机访问,而不能从网络中的任何其他计算机访问。通过添加 --host=0.0.0.0
到命令行使服务器公开可用:
$ flask run --host=0.0.0.0
4.Pycharm启动
其他命令行文档:
Command Line Interface — Flask Documentation (2.0.x)