Flask应用是一个Flask
类的实例。所有关于应用的内容,例如配置与URL,都会随着类一起注册。
创建Flask应用最简单的办法,就是在代码最顶层创建一个全局Flask实例。但是随着代码量的增加,这种方法会引发很多棘手的问题。
在函数内部创建Flask实例是个比较好的方法,这个函数被称为应用工厂,所有的配置、注册以及其他构件过程都在这个函数里进行,最后返回应用。
应用工厂
创建flaskr目录并加入一个__init__.py文件。这个文件提供这些功能:包含应用工厂,并且告诉python解释器,flaskr目录是一个应用包。
mkdir flaskr
flaskr/__init__.py
import os
from flask import Flask
def create_app(test_config=None):
# create and configure the app
app = Flask(__name__, instance_relative_config=True)
app.config.from_mapping(
SECRET_KEY='dev',
DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
)
if test_config is None:
# load the instance config, if it exists, when not testing
app.config.from_pyfile('config.py', silent=True)
else:
# load the test config if passed in
app.config.from_mapping(test_config)
# ensure the instance folder exists
try:
os.makedirs(app.instance_path)
except OSError:
pass
# a simple page that says hello
@app.route('/hello')
def hello():
return 'Hello, World!'
return app
create_app
就是一个应用工程函数,分析一下它做了什么:
app = Flask(__name__, instance_relative_config=True)
创建了Flask实例
__name__
为当前python模块名,app需要知道自己开始的路径,而__name__
做这件事更简便一些。instance_relative_config=True
实例文件夹位于flaskr
包之外,保存一些不能上传到版本控制的本地数据,例如配置密码以及数据库文件。这个配置告诉app读取与实例文件夹相关的配置文件
app.config.from_mapping()
设置了默认配置
SECRET_KEY
Flask及其扩展用来保证数据安全的配置。这里使用简单的‘dev’,实际环境中应该使用强随机字符DATABASE
存储sqlite文件所在的位置,这里是位于app.instance_path
目录下,也就是实例文件夹下
app.config.from_pyfile()
如果配置文件config.py
存在,则会覆盖默认配置,例如可以用来配置一个强壮的SECRETtest_config
也可以传给工厂,会被用来替换实例的配置
os.makedirs()
确认app.instance_path
是否存在,因为Flask本身是不会自动建立文件夹的,但实际上需要这个目录来存放sqlite 数据库文件
运行应用
以开发模式运行:
linux or mac
export FLASK_APP=flaskr
export FLASK_ENV=development
flask run
Windows cmd
set FLASK_APP=flaskr
set FLASK_ENV=development
flask run
Windows PowerShell
$env:FLASK_APP = "flaskr"
$env:FLASK_ENV = "development"
flask run
配置无误的话会显示如下信息:
* Serving Flask app "flaskr"
* Environment: development
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 855-212-761