在Flask的设置/配置文件中自定义模块,常量和数据库

时间:2013-03-07 11:50:50

标签: python settings flask

过去一周我一直在玩Flask。为了好玩,我正在尝试实现以下内容。是的,我知道这是非常Django式的,也许不适合微框架。

以下是我正在尝试做的一个示例:

STATIC_PATH = '/static/'
TEMPLATE_URL = '/template/'
DATABASES = {
  'DEBUG': {
    'ENGINE': 'bla.sqlite3',
    'NAME': 'koopics.db'
  },
  'DEMO': {
    'ENGINE': 'bla.sqlite3',
    'NAME': 'somedb'
  },
  'PRODUCTION': {
    'ENGINE': 'bla.psycopg2',
    'NAME': 'somedb',
    'host': 'host',
    'username': 'host',
    'password': 'host',
  },
}

MODE = 'Demo'

#TODO: put an IF statement here to provide  the connection mechanism for the db
#      depending on what is required    

INSTALLED_APPS = [
  'Flask-SQLAlchemy',
  'Flask-DebugToolbar',
  'Flask-Mail',
  'Flask-Cache',
  'Flask-Celery',
  'my_custom_module',
]

我目前使用__init__.py在自己的文件夹中定义了自定义应用。

问题:是否可以让数据库运行并将“应用”作为设置和app.py的一部分加载?

1 个答案:

答案 0 :(得分:1)

在处理任何其他内容之前,首先加载您的设置。如果要根据请求切换DB,则需要将此if放在模型/视图逻辑中。

根据docs(您的设置看起来更像django而不是常规flask所以我不确定这是否会有效)您可以使用__bind_key__在您的模型中将该模型定向到特定的数据库

# settings.py
SQLALCHEMY_BINDS = {
    'DEBUG': 'sqlite:////path/to/koopics.db',
    'DEMO': 'sqlite:////path/to/somedb.db'
}

并在您的模型中

# model
class DebugModel(db.Model):
    __bind_key__ = 'DEBUG'
    id = db.Column(db.Integer, primary_key=True)
    debug_value = db.Column(db.String(80), unique=True)

但是,如果你的意思是你想让它以一种方式访问​​数据库进行生产,而另一种方式进行开发,那么

import os

if os.environ('MACHINE_NAME', '') == 'PRODUCTION':
    # set up production db
else:
    # set up development db

然后您设置中的if是合适的。