《flask Web开发》第七章中,有config的代码
创建一个文件Config.py保存配置:
#coding:utf-8
import os
basedir = os.path.abspath(os.path.dirname(__file__))
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
SQLALCHEMY_TRACK_MODIFICATIONS =False
#上传图片、Excel、Xmind路径设置
UPLOAD_IMG_FOLDER = os.path.join(basedir, 'app/static/upload/img/')
UPLOAD_EXCEL_FOLDER = os.path.join(basedir, 'app/static/upload/excel/')
UPLOAD_XMIND_FOLDER = os.path.join(basedir, 'app/static/upload/xmind/')
#...各种其他通用配置变量在此省略
@staticmethod
def init_app(app):
pass
class DevelopmentConfig(Config):
#该环境下特有配置,省略
class TestingConfig(Config):
#该环境下特有配置,省略
class ProductionConfig(Config):
#该环境下特有配置,省略
config = {
'development': DevelopmentConfig,
'testing': TestingConfig,
'production': ProductionConfig,
'default': DevelopmentConfig
}
创建基类Config来保存通用配置 其他的各环境使用不同的配置 再用一个字典提供选择,但是不懂静态方法init_app的具体作用是什么?一个空函数可以做什么?
在__init__.py中使用它:
#coding:utf-8
from flask import Flask, render_template
from config import config
from flask_sqlalchemy import SQLAlchemy
from flask_bootstrap import Bootstrap
from flask_mail import Mail
from flask_login import LoginManager
from flask_pagedown import PageDown
from flask_moment import Moment
import datetime
from flask_wtf.csrf import CsrfProtect
""" 各组件初始化 """
csrf = CsrfProtect()
bootstrap = Bootstrap()
db = SQLAlchemy()
mail = Mail()
login_manager = LoginManager()
# session安全保护级别设置
login_manager.session_protection = 'basic'
# 默认登录入口
login_manager.login_view = 'auth.login'
pagedown = PageDown()
moment = Moment()
""" 根据配置选项创建Flask APP """
def create_app(config_name):
app = Flask(__name__)
# 使用chartkick配合falsk画报表
app.jinja_env.add_extension("chartkick.ext.charts")
app.config.from_object(config[config_name])
config[config_name].init_app(app)
csrf.init_app(app)
bootstrap.init_app(app)
db.init_app(app)
mail.init_app(app)
login_manager.init_app(app)
pagedown.init_app(app)
moment.init_app(app)
""" 按照功能模块来组织蓝图 """
from .index import index as index_blueprint
app.register_blueprint(index_blueprint, url_prefix='/')
return app