我在查找运行带扩展程序配置参数的Flask应用程序的pythonic方法时遇到了一些麻烦。
这是我的myapp/__init__.py
,它初始化了烧瓶应用及其扩展名:
from flask import Flask
from flask.ext.script import Manager
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.redis import Redis
app = Flask(__name__)
manager = Manager(app)
db = SQLAlchemy(app)
redis = Redis(app)
我决定将应用程序的配置存储在单独的文件中以进行调试和部署,并使用Flask.config.from_pyfile
加载它们。
配置文件有几个选项,包括:
SQLALCHEMY_DATABASE_URI = "sqlite:////tmp/test.db"
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
REDIS_DB = 0
我使用Flask-Script来运行服务器:
from myapp import app, manager
@manager.command
def debug():
app.config.from_pyfile("debug.cfg")
app.run()
虽然SQLAlchemy工作正常(在/tmp/test.db
创建一个SQLite数据库),但我还没有运行Redis实例,因为它似乎很难在REDIS_HOST
之前找到app.config
甚至从配置文件加载。
有没有办法绕过它而不必在从文件导入配置之前硬编码默认设置?
答案 0 :(得分:3)
是的,如果您将app
传递给Redis()
构造函数,则需要加载配置。
推迟传递app
,加载配置后调用redis.init_app(app)
:
app = Flask(__name__)
manager = Manager(app)
db = SQLAlchemy()
redis = Redis()
def attach_extensions(app):
db.init_app(app)
redis.init_app(app)
然后加载配置时:
from myapp import app, manager, attach_extensions
@manager.command
def debug():
app.config.from_pyfile("debug.cfg")
attach_extensions(app)
app.run()