我正在学习Python flask的教程。我有一个这样的config.py
:
import os
basedir = os.path.abspath(os.path.dirname(__file__))
class Config():
SECRET_KEY = os.environ.get('SECRET_KEY') or 'DDFHSJ734H927YF9843'
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
SQLALCHEMY_TRACK_MODIFICATIONS = False
MAIL_SERVER = 'smtp.googlemail.com'
MAIL_PORT = 587
MAIL_USE_TLS = True
MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
FLASKY_MAIL_SUBJECT_PREFIX = '[Flasky]'
FLASKY_MAIL_SENDER = 'Flasky Admin <flasky@example.com>'
FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')
# Implement this later
@staticmethod
def init_app(app):
pass
class DevelopmentConfig(Config):
DEBUG = True
SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or
'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite')
class TestingConfig(Config):
TESTING = True
SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URL') or
'sqlite:///' + os.path.join(basedir, 'data-test.sqlite')
class ProductionConfig(Config):
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or
'sqlite:///' + os.path.join(basedir, 'data.sqlite')
config = {
'development': DevelopmentConfig,
'testing': TestingConfig,
'production': ProductionConfig,
'default': DevelopmentConfig
}
我对底部的配置字典感到困惑。例如,'development': DevelopmentConfig
是否指向初始化的DevelopmentConfig
对象?为什么不'development': DevelopmentConfig()
.另外,为什么object
从基Config
类的参数中省略了?
在 Python 中,类是对象。因此,该字典中的development
键具有一个值,即类DevelopmentConfig
。这样,您可以调用 config['development']()
,您将拥有一个初始化的 DeveloptmentConfig
对象。至于省略object
,在Python 3中,如果没有父类被赋予新类,它会自动object
子类。
例如,
'development': DevelopmentConfig
是否指向初始化的DevelopmentConfig
对象?
否,它包含对 DevelopmentConfig
类的引用。
为什么不
'development': DevelopmentConfig()
.
因为这可能不是实例化类的合适位置。 此外,如果实际上只有一个类可以在不导致错误的情况下实例化。
另外,为什么
object
从基Config
类的参数中省略了?
因为它纯粹是可选的。在 Python 2.6+ 中,它创建了一个旧式类而不是新式类,而在 Python 3.x 中它没有任何区别(请注意,空的超类说明符在 2.5 或更早版本中是无效的语法;括号应该完全省略(。