1

我有一个 python/django 项目,我使用 git 版本控制为开发和生产设置了该项目。我有三个 settings.py 文件:

-settings.py(其中包含潜在开源项目的虚拟变量),

-settings_production.py(用于生产变量),以及

-settings_local.py(仅为我的本地环境覆盖设置)。git 不跟踪此文件。

我使用这种方法,效果很好:

try:
    from settings_production import *
except ImportError, e:
    print 'Unable to load settings_production.py:', e

try:
    from settings_local import *
except ImportError, e:
    print 'Unable to load settings_local.py:', e

但是,我希望这是一个开源项目。我设置了两个 git 遥控器,一个称为“heroku-production”,一个称为“github-opensource”。如何设置它以使“heroku-remote”包含 settings_production.py 而“github-opensource”不包含,以便我可以将这些设置保密?

帮助!我查看了互联网上的大多数资源,但它们似乎没有解决这个用例。这是正确的方法吗?有更好的方法吗?

我的梦想是能够将我的本地环境推送到 heroku-production 或 github-opensource 而不必弄乱设置文件。

注意:我查看了使用环境变量或不跟踪生产设置的设置,但感觉过于复杂。我喜欢在本地设置中看到我面前的一切。看这个方法

我也浏览了所有这些方法,但它们似乎并不完全符合要求。

4

2 回答 2

0

我认为使用环境变量,如 Django 的两个勺子一书中所述,是最好的方法。

我正在遵循这种方法,并且我有一个应用程序在生产中运行了一个私有 GitHub 存储库(平均每月有 50 万页浏览量)、暂存和两个开发环境,并且我使用这样的目录结构:

MyProject
-settings
--__init__.py
--base.py
--production.py
--staging.py
--development_1.py
--development_2.py

我将所有环境共有的所有内容都保存在 base.py 中,然后对 production.py、staging.py、development_1.py 或 development_2.py 进行适当的更改。

我的生产部署过程包括 virtualenv、Fabric、upstart、bash 脚本(由 upstart 使用)、gunicorn 和 Nginx。我有一个稍微修改过的 bash 脚本版本,我使用 upstart 来运行测试服务器;它是这样的:

#!/bin/bash -e
# starts the development server using environment variables and django-admin.py

PROJECTDIR=/home/user/project
PROJECTENV=/home/user/.virtualenvs/project_virtualenv
source $PROJECTENV/bin/activate

cd $PROJECTDIR
export LC_ALL="en_US.UTF-8"

export HOME="/home/user"
export DATABASES_DEFAULT_NAME_DEVELOPMENT="xxxx"
export DATABASES_DEFAULT_USER_DEVELOPMENT="xxxxx"
export DATABASES_DEFAULT_PASSWORD_DEVELOPMENT="xxx"
export DATABASES_DEFAULT_HOST_DEVELOPMENT="127.0.0.1"
export DATABASES_DEFAULT_PORT_DEVELOPMENT="5432"
export REDIS_HOST_DEVELOPMENT="127.0.0.1:6379"

django-admin.py runserver --pythonpath=`pwd` --settings=MyProject.settings.development_1 0.0.0.0:8006

请注意,这不是完整的故事,我正在简化以说明我的观点。我在 base.py 中有一些额外的 Python 代码,它们也从这些环境变量中获取值。

玩这个,并确保检查 Django 的两个勺子中的相关章节,我也使用了你提到的导入方法,但是从存储库中获取设置并不容易管理,几个月前我进行了切换;这对我帮助很大。

于 2013-04-20T20:13:56.253 回答
0

这里有一个非常相似的问题。其中一个答案表明git submodules 我会说这是最简单的方法。这是您的 VCS 的问题,而不是您的 Python 代码。

于 2013-04-20T22:30:24.473 回答