使用工厂函数方式创建 APP,更加符合规范,并且部署和测试也更加方便,灵活性也更加的高。一般工厂函数创建 APP 首先需要先加载配置,然后初始化扩展,最后返回程序实例。
# __init__.py
import ...
db = SQLAlchemy()
cors = CORS()
def create_app(config_name=None):
# 加载配置
if config_name is None:
config_name = os.getenv("FLASK_CONFIG", "dev")
app = Flask(__name__)
app.config.from_object(config_choice.get(config_name))
register_logging(app) # 加载日志处理器
register_extensions(app) # 注册扩展
register_api(app) # 注册API或者蓝图
register_errors(app) # 注册错误处理
register_commands(app) # 注册click或script命令
register_shell_context(app) # 注册shell上下文
register_template_context(app) # 注册模板上下文
return app
def register_logging(app):
app.logger.setLevel(logging.INFO)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
file_hanlder = RotatingFileHandler("logs/app.log", maxBytes=10 * 1024 * 1024, backupCount=10)
file_hanlder.setFormatter(formatter)
file_hanlder.setLevel(logging.INFO)
if not app.debug:
app.logger.addHandler(file_hanlder)
def register_extensions(app):
db.init_app(app) # 初始化db
cors.init_app(app) # 初始化跨域模块
...
def register_api(app):
app.register_blueprint(index)
app.register_blueprint(admin)
...
def register_errors(app):
@app.errorhandler(400)
def bad_request(e):
return render_template("errors/400.html"), 400
def register_commands(app):
pass
def register_shell_context(app):
pass
def register_template_context(app):
pass
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于