Несколько способов использования различных конфигураций настроек сервера для Flask.
Вариант 1: как в официальной доке
С советами в официальной части можно ознакомиться здесь.
В официальной инструкции, помимо прочего, дают рекомендации делать через смену конфигураций:
app = Flask(__name__)
# app.config.from_object('config.DevelopmentConfig')
app.config.from_object('config.ProductionConfig')
return app
Минус такого подхода в заливке. Перед отправкой изменений на сервер придется постоянно комментировать/раскомментировать код.
Вариант 2: делим конфиги на две части
Разделить конфиги на 2 части:
app = Flask(__name__)
app.config.from_object(Config)
app.config.from_pyfile('../config-extended.py')
return app
ploshadka.net/config.py — этот файл нужно создать самостоятельно на сервере, потому что там важная секретная информация. И такой же создаем у себя на локальном компьютере. А если нужно, также и на тестовом.
ploshadka.net/config-extended.py — этот файл будет у нас отправляться в git и здесь ничего важного с точки зрения безопасности.
Теперь в зависимости от нахождения кода будет подтягиваться разная конфигурация сервера.
Содержимое файла config.py может быть таким:
class Config(object):
DEBUG = True
SECRET_KEY = os.environ.get('SECRET_KEY') or 'fsdkfd32r234fsdf'
SQLALCHEMY_DATABASE_URI = 'postgresql://localhost/db_name'
################
# Flask-Security
################
SECURITY_PASSWORD_HASH = "pbkdf2_sha512"
SECURITY_PASSWORD_SALT = "fsdfdfsdfdfsdafds"
На сервере тот же файл:
class Config(object):
DEBUG = False
SECRET_KEY = os.environ.get('SECRET_KEY') or 'fsDFKsmf923jnagd'
SQLALCHEMY_DATABASE_URI = 'postgresql://user:pass/db_name'
SQLALCHEMY_TRACK_MODIFICATIONS = False
################
# Flask-Security
################
SECURITY_PASSWORD_HASH = "pbkdf2_sha512"
SECURITY_PASSWORD_SALT = "fsdfk3fsdDFFdfsr0fsa"
Следует отметить, что такие данные как SECRET_KEY, SECURITY_PASSWORD_SALT или другие подобные можно еще более безопасно хранить в переменных окружения. Но это тема отдельной статьи и тут разбираться не будет.
Содержимое файла config-extended.py может быть таким:
# Features
##########
SQLALCHEMY_TRACK_MODIFICATIONS = False
################
# Flask-Security
# https://pythonhosted.org/Flask-Security/configuration.html
################
# URLs
SECURITY_URL_PREFIX = "/admin"
SECURITY_LOGIN_URL = "/login/"
SECURITY_LOGOUT_URL = "/logout/"
SECURITY_POST_LOGIN_VIEW = "/admin/"
SECURITY_POST_LOGOUT_VIEW = "/admin/"
SECURITY_POST_REGISTER_VIEW = "/admin/"
# Включает регистрацию
SECURITY_REGISTERABLE = True
SECURITY_REGISTER_URL = "/register/"
SECURITY_SEND_REGISTER_EMAIL = False
# Включет сброс пароля
SECURITY_RECOVERABLE = True
SECURITY_RESET_URL = "/reset/"
SECURITY_SEND_PASSWORD_RESET_EMAIL = True
# Включает изменение пароля
SECURITY_CHANGEABLE = True
SECURITY_CHANGE_URL = "/change/"
SECURITY_SEND_PASSWORD_CHANGE_EMAIL = False
# todo не работает отправка email
# AttributeError: 'NoneType' object has no attribute 'send'
Вариант 3: разделяем конфиги на много частей
С расширением проекта увеличивается кол-во конфигов. Для порядка выносим все конфиги в отдельную директорию configs. В поддиректории private храним конфиги в которых содержимое отличается от продакшена и локальной разработки. Эти конфиги добавляем в файл .gitignore и вручную создаем на сервере.
app = Flask(__name__)
app.config.from_pyfile('../configs/private/main.py')
app.config.from_pyfile('../configs/private/celery.py')
app.config.from_pyfile('../configs/sqlalchemy.py')
app.config.from_pyfile('../configs/flask-security.py')
app.config.from_pyfile('../configs/beatschedule.py')
return app