【问题标题】:Build Automation for Django为 Django 构建自动化
【发布时间】:2011-10-25 10:03:42
【问题描述】:

对于为我的开发和 django 框架做系统管理员的工作,我还是很陌生。我想为本地开发站和生产环境使用不同的用户名/密码。

我使用 dotcloud 作为服务器。我可以编写一个安装后脚本(在 python、bash 等中),它会在每次新推送时执行它。

但是我不知道该怎么做。我需要自己写这个吗?有没有 python/django 构建自动化工具可以帮助我解决这个问题?

澄清:如何仅在服务器上将settings.py 中的debug=false 更改为true?

【问题讨论】:

标签: python django build build-automation


【解决方案1】:

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 了解其他策略。

【讨论】:

  • 我不喜欢这两个答案的开销,尽管我使用了第一个答案。我认为这不应该在应用程序代码中 - 它应该是用于构建自动化的 shell 脚本或类似的东西。例如。说我想撒上调试代码,是否应该在代码周围,我应该在部署时将其删除?我仍在寻找更好的解决方案:)
  • 例如html5 样板构建。像这样。
  • 调试日志应该被你的生产日志配置过滤掉。另一方面,你怎么能指望你的构建系统将“调试代码”与其他代码区分开来?您想根据部署位置使用两种不同的代码吗?这可能会对您测试代码的能力产生不良影响。
  • 样板构建中唯一适用于 django 项目的一点是“删除仅开发代码(任何剩余的 console.log 文件、分析、测试套件)”。好吧,正如已经说过的,日志记录是在配置中管理的,分析不是在应用程序代码中完成的,并且测试应该在它们的 app/tests.py 模块中,甚至在请求/响应阶段都不会读取,如果你需要,它们仍然很有用在生产环境中进行测试(与本地环境不同)。
【解决方案2】:

如果我的项目驻留在本地目录结构中,我通常会在生产 settings.py 的末尾导入我的开发设置。

您还可以将您的数据库设置和其他在生产和开发中不同的设置存储在一个单独的文件中,并将它们从您的 SVN、您使用的任何 Git 中删除。

只需在 settings.py 的末尾添加:

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

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

如果您想在开发服务器和生产服务器之间动态选择,请在设置结束时使用:

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

请注意,我是在头脑中写的,其中可能存在一些错误。我会在我回家时验证这一点。

【讨论】:

  • 这行不通,例如在from package import module 中导入的名称会被命名为module.DEBUG。 Django 很乐意忽略任何production_settings.DEBUG 常量。您应该从包含实际设置的一个或另一个模块导入*
  • 已更正。感谢您的准确评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 2010-10-19
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多