Django的构建自动化

1 投票
2 回答
1631 浏览
提问于 2025-04-16 23:26

我刚开始接触系统管理的工作,也在学习django框架。我想在本地开发环境和生产环境中使用不同的用户名和密码。

我在使用dotcloud作为服务器。我可以写一个安装后脚本(用python、bash或者其他语言),这个脚本会在每次新推送代码时执行。

不过我不太清楚该怎么做。我需要自己写这个脚本吗?有没有什么python或django的自动化工具可以帮我实现这个?

补充说明: 我怎么才能在服务器上把debug=false改成true呢?

2 个回答

3

在Django中,标准的做法是使用一个叫做DJANGO_SETTINGS_MODULE的环境变量。你可以把它指向不同的设置文件,然后让这些设置文件导入一个共同的设置模块,这样可以处理一些共同的配置。

# settings_production.py

from settings_common import *
DEBUG = False
DATABASES = {...}


# settings_development.py

from settings_common import *
DEBUG = True
DATABASES = {...}


# settings_common.py

INSTALLED_APPS = (...) # etc

另外,你也可以采用另一种策略,就是使用一个主要的设置文件,然后根据一些系统条件从另一个设置文件中导入特定的内容。例如,你可以通过获取os.platform.node()或者socket.gethostname()的值来决定使用哪个设置(或者这个值的一部分)。

reversed_hostname_parts = socket.gethostname().split('.').reverse()
host_specific = {
    ('com', 'dotcloud'): 'production',
    ('local'): 'dev',
}

for index in range(len(reversed_hostname_parts)):
    identifier = tuple(reversed_hostname_parts[:index+1])
    if identifier in host_specific:
        extra_settings = host_specific[identifier]
        break
else: # executed when the loop has not been `break`ed
    extra_settings = 'dev'  # any default value


if extra_settings == 'dev':
    from development_settings import *
elif extra_settings == 'production':
    from production_settings import *

编辑:添加了链接

可以查看 https://code.djangoproject.com/wiki/SplitSettings 来了解其他策略。

1

我通常会在生产环境的settings.py文件最后导入我的开发环境设置,前提是我的项目是在本地文件夹里。

你也可以把数据库设置和其他在生产环境和开发环境中不同的设置放在一个单独的文件里,然后把这个文件从你的版本控制系统(比如SVN、Git等)中去掉。

只需要在settings.py的最后加上这个:

try:
  from myapp.specific_settings import *
except ImportError:
  pass

在这种情况下,specific_settings在生产环境和开发环境中会有所不同。

如果你想根据需要动态选择开发服务器和生产服务器,可以在settings的最后使用这个:

import os
directory = os.path.dirname(__file__)
if directory == '/home/yourname/development/':
    from myapp.development_settings import *
else:
    from myapp.production_settings import * 

注意,我是随便写的,可能会有一些错误。我回家后会检查一下。

撰写回答