Python 多站点django设置的重复设置
我在heroku上的多个应用程序上使用相同的django代码库。我的设置是使用git主分支和每个独立域的单独分支。然而,我正在努力寻找一个理想的解决方案,即存储不同应用程序的设置变量 我将它们存储在环境变量中,分别存储在heroku上的每个应用程序中。这当然是理想的解决方案。但是,有一个或两个管理功能,我目前只在我的应用程序中本地运行,需要知道每个应用程序的设置。这意味着我必须在每个应用程序环境中存储每个应用程序的所有设置。例如: 而不是Python 多站点django设置的重复设置,python,django,heroku,Python,Django,Heroku,我在heroku上的多个应用程序上使用相同的django代码库。我的设置是使用git主分支和每个独立域的单独分支。然而,我正在努力寻找一个理想的解决方案,即存储不同应用程序的设置变量 我将它们存储在环境变量中,分别存储在heroku上的每个应用程序中。这当然是理想的解决方案。但是,有一个或两个管理功能,我目前只在我的应用程序中本地运行,需要知道每个应用程序的设置。这意味着我必须在每个应用程序环境中存储每个应用程序的所有设置。例如: 而不是 site_email=blah@site.com 我最
site_email=blah@site.com
我最终会得到:
site1_email=blah@site1.com
site2_email=blah@site2.com
等等
我可以这样做,但对我来说这看起来很混乱。还有其他选择吗?我可以删除有问题的功能并将它们构建到他们自己的应用程序中,但这似乎需要做大量的工作来隐藏彼此之间的应用程序设置。以下是我们在“杂色傻瓜”上的做法 我们有多个设置文件,每个环境一个 我们有一个
defaults.py
settings文件,它是所有环境的“库存”
我们为每个环境提供了设置文件:testing.py
,live.py
等
其中包含对默认设置的更改(或根据需要完全不同的设置)
我们使用Fabric+内部部署器将正确的设置文件部署到正确的环境中
我们有这样一个文件(简化):
我们有一个内部部署程序,用于编写环境创建脚本:
def setup():
from fabric.api import cd, env
with cd(env.checkout):
env.run('python create_manage_script.py %s' % env.environment)
因此,当我们部署时,会发生以下情况:
- 用户运行
fab{{{environment}}deploy
- 我们的部署人员查看设置目录,并查找与环境名称匹配的设置文件(testing/live/etc)
- 部署人员向结构发送适当的命令
- Fabric将代码部署到该服务器,并将服务器指向正确的设置文件
需要注意的是,我们有三个不同的环境(开发、测试、直播),我们有三个不同的应用程序使用这三个不同的环境。下面是我们在“杂色傻瓜”上的做法 我们有多个设置文件,每个环境一个 我们有一个
defaults.py
settings文件,它是所有环境的“库存”
我们为每个环境提供了设置文件:testing.py
,live.py
等
其中包含对默认设置的更改(或根据需要完全不同的设置)
我们使用Fabric+内部部署器将正确的设置文件部署到正确的环境中
我们有这样一个文件(简化):
我们有一个内部部署程序,用于编写环境创建脚本:
def setup():
from fabric.api import cd, env
with cd(env.checkout):
env.run('python create_manage_script.py %s' % env.environment)
因此,当我们部署时,会发生以下情况:
- 用户运行
fab{{{environment}}deploy
- 我们的部署人员查看设置目录,并查找与环境名称匹配的设置文件(testing/live/etc)
- 部署人员向结构发送适当的命令
- Fabric将代码部署到该服务器,并将服务器指向正确的设置文件
需要注意的是,我们有三个不同的环境(开发、测试、直播),我们有三个不同的应用程序使用这三个不同的环境。鉴于以下应用程序设置:
/Project/
/app1/
/app2/
/project/ (the project app that gets auto created in Django 1.4+)
/settings/
__init__.py <- general site inspecific settings
sitea.py <- site A's specific settings
siteb.py <- site B's specific settings
然后在heroku运行/启动脚本中执行以下操作(我假设您将使用gunicorn或其他生产django服务器)
更新-示例Project/Project/settings/production.py
文件,注意:所有敏感信息都是从环境读取的,而不是从文件读取的。
给定以下应用程序设置:
/Project/
/app1/
/app2/
/project/ (the project app that gets auto created in Django 1.4+)
/settings/
__init__.py <- general site inspecific settings
sitea.py <- site A's specific settings
siteb.py <- site B's specific settings
然后在heroku运行/启动脚本中执行以下操作(我假设您将使用gunicorn或其他生产django服务器)
更新-示例Project/Project/settings/production.py
文件,注意:所有敏感信息都是从环境读取的,而不是从文件读取的。
您可以使用公共设置创建单独的python模块,并从您的设置中导入此模块中的设置您可以使用公共设置创建单独的python模块,并从您的设置中导入此模块中的设置感谢您的深入回答。这是一个非常有趣的方法,但我希望有一个相当简单的解决方案,利用heroku的环境变量,允许我将代码从配置中分离出来尽管考虑到这一点,可能没有一个简单的解决方案…也许采用您的方法,拥有一个本地主设置文件,然后构建一个脚本,将单独的设置推送到每个应用程序,这是唯一的方法感谢您的深入回答。这是一个非常有趣的方法,但我希望有一个相当简单的解决方案,利用heroku的环境变量,允许我将代码从配置中分离出来尽管考虑到这一点,可能没有一个简单的解决方案……也许采用您的方法,拥有一个本地主设置文件,然后构建一个脚本,将单独的设置推送到每个应用程序,这是我喜欢这个解决方案的唯一方式。是的,我会失去代码和配置的分离,但至少我会保持理智,这是非常简单的。是的,heroku使用gunicorn。我可以在每个git分支中使用一个单独的Procfile来加载正确的设置文件。对于我在本地运行并且需要访问
sitea.py
和siteb.py
中设置的主分支,我需要在代码中单独引用它们吗?i、 e.site\u email=settings.sitea.site\u email
?在代码中,这是正常的:从django.conf导入设置
和设置。site\u email
根据您所在的站点,它会将该站点的电子邮件加载到该设置中。我知道这对其中一个分支的工作方式
python manage.py runserver --settings=project.settings.sitea
from project.settings import *
DEBUG = True
TEMPLATE_DEBUG = DEBUG
ADMINS = (
('Francis', 'francis@teamcolab.com'),
)
MANAGERS = ADMINS
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': os.environ.get('MYSQL_DATABASE'), # Or path to database file if using sqlite3.
# The following settings are not used with sqlite3:
'USER': os.environ.get('MYSQL_USER'),
'PASSWORD': os.environ.get('MYSQL_PASSWORD'),
'HOST': os.environ.get('MYSQL_HOST'), # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
'PORT': os.environ.get('MYSQL_PORT'), # Set to empty string for default.
}
}
REDIS = {
'HOST' : os.environ.get('REDIS_HOST'),
'PASSWORD' : os.environ.get('REDIS_PASSWORD', None),
'PORT' : int(os.environ.get('REDIS_PORT', 6379)),
'DB' : int(os.environ.get('REDIS_DB', 0)),
}
WEBSOCKET_URL = os.environ.get('WEBSOCKET_URL')
# Hosts/domain names that are valid for this site; required if DEBUG is False
# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts
ALLOWED_HOSTS = ['XX.com','production.XX.com','www.XX.com',]
SESSION_COOKIE_DOMAIN = '.XX.com'
# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/var/www/example.com/media/"
MEDIA_ROOT = os.environ.get('MEDIA_ROOT')
# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/var/www/example.com/static/"
STATIC_ROOT = os.environ.get('STATIC_ROOT')