config.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import os
  2. basedir = os.path.abspath(os.path.dirname(__file__))
  3. class Config:
  4. SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'
  5. MAIL_SERVER = os.environ.get('MAIL_SERVER', 'smtp.googlemail.com')
  6. MAIL_PORT = int(os.environ.get('MAIL_PORT', '587'))
  7. MAIL_USE_TLS = os.environ.get('MAIL_USE_TLS', 'true').lower() in \
  8. ['true', 'on', '1']
  9. MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
  10. MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
  11. FLASKY_MAIL_SUBJECT_PREFIX = '[Flasky]'
  12. FLASKY_MAIL_SENDER = 'Flasky Admin <flasky@example.com>'
  13. FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')
  14. SSL_REDIRECT = False
  15. SQLALCHEMY_TRACK_MODIFICATIONS = False
  16. SQLALCHEMY_RECORD_QUERIES = True
  17. FLASKY_POSTS_PER_PAGE = 20
  18. FLASKY_FOLLOWERS_PER_PAGE = 50
  19. FLASKY_COMMENTS_PER_PAGE = 30
  20. FLASKY_SLOW_DB_QUERY_TIME = 0.5
  21. @staticmethod
  22. def init_app(app):
  23. pass
  24. class DevelopmentConfig(Config):
  25. DEBUG = True
  26. SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \
  27. 'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite')
  28. class TestingConfig(Config):
  29. TESTING = True
  30. SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URL') or \
  31. 'sqlite://'
  32. WTF_CSRF_ENABLED = False
  33. class ProductionConfig(Config):
  34. SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
  35. 'sqlite:///' + os.path.join(basedir, 'data.sqlite')
  36. @classmethod
  37. def init_app(cls, app):
  38. Config.init_app(app)
  39. # email errors to the administrators
  40. import logging
  41. from logging.handlers import SMTPHandler
  42. credentials = None
  43. secure = None
  44. if getattr(cls, 'MAIL_USERNAME', None) is not None:
  45. credentials = (cls.MAIL_USERNAME, cls.MAIL_PASSWORD)
  46. if getattr(cls, 'MAIL_USE_TLS', None):
  47. secure = ()
  48. mail_handler = SMTPHandler(
  49. mailhost=(cls.MAIL_SERVER, cls.MAIL_PORT),
  50. fromaddr=cls.FLASKY_MAIL_SENDER,
  51. toaddrs=[cls.FLASKY_ADMIN],
  52. subject=cls.FLASKY_MAIL_SUBJECT_PREFIX + ' Application Error',
  53. credentials=credentials,
  54. secure=secure)
  55. mail_handler.setLevel(logging.ERROR)
  56. app.logger.addHandler(mail_handler)
  57. class HerokuConfig(ProductionConfig):
  58. SSL_REDIRECT = True if os.environ.get('DYNO') else False
  59. @classmethod
  60. def init_app(cls, app):
  61. ProductionConfig.init_app(app)
  62. # handle reverse proxy server headers
  63. try:
  64. from werkzeug.middleware.proxy_fix import ProxyFix
  65. except ImportError:
  66. from werkzeug.contrib.fixers import ProxyFix
  67. app.wsgi_app = ProxyFix(app.wsgi_app)
  68. # log to stderr
  69. import logging
  70. from logging import StreamHandler
  71. file_handler = StreamHandler()
  72. file_handler.setLevel(logging.INFO)
  73. app.logger.addHandler(file_handler)
  74. class DockerConfig(ProductionConfig):
  75. @classmethod
  76. def init_app(cls, app):
  77. ProductionConfig.init_app(app)
  78. # log to stderr
  79. import logging
  80. from logging import StreamHandler
  81. file_handler = StreamHandler()
  82. file_handler.setLevel(logging.INFO)
  83. app.logger.addHandler(file_handler)
  84. class UnixConfig(ProductionConfig):
  85. @classmethod
  86. def init_app(cls, app):
  87. ProductionConfig.init_app(app)
  88. # log to syslog
  89. import logging
  90. from logging.handlers import SysLogHandler
  91. syslog_handler = SysLogHandler()
  92. syslog_handler.setLevel(logging.INFO)
  93. app.logger.addHandler(syslog_handler)
  94. config = {
  95. 'development': DevelopmentConfig,
  96. 'testing': TestingConfig,
  97. 'production': ProductionConfig,
  98. 'heroku': HerokuConfig,
  99. 'docker': DockerConfig,
  100. 'unix': UnixConfig,
  101. 'default': DevelopmentConfig
  102. }