django - 在 svn/hg/git/etc 中优雅地处理特定于站点的设置/配置?

标签 django version-control configuration

我一直在寻找一种更好的方法来处理特定于站点的设置(在本例中为 django settings.py 文件)。

settings.py 结构和字段相当一致,但在开发人员的盒子、集成、QA、测试和生产环境之间的值不同。

什么是控制设置源同时仍允许在不同框之间进行更改的优雅方式?

我还担心源代码控制中包含敏感数据(例如数据库密码),但我确实想要自动化部署。

我们使用的示例:

  • settings.py 设置常用值,然后根据主机名或用户名加载辅助设置文件。
  • 使用部署脚本将值注入(inject)到 settings.py 文件中。但这只是将问题转移到管理部署脚本而不是 settings.py 脚本。

  • 有人有特别优雅的方法吗?

    最佳答案

    创建一个主 settings.py 文件,其中应包括以下内容:

    # Pull in hostname-based changes.
    import socket
    HOSTNAME = socket.gethostname().lower().split('.')[0].replace('-','')
    
    try:
        exec "from myproject.settings.host_%s import *" % HOSTNAME
    except ImportError:
        pass
    
    # Pull in the local changes.
    try:
        from myproject.settings.local import *
    except ImportError:
        pass
    

    现在,您为您关心的每个主机名创建一个新的设置文件。但这些真的很小。您的每个生产服务器的文件只包含:
    from myproject.settings.production import *
    

    并且您的登台服务器具有:
    from myproject.settings.staging import *
    

    现在,您可以创建一个 production.py 文件,其中包含用于设置的生产覆盖、一个 staging.py 等。您可以为服务器扮演的每个角色创建新文件。

    最后,您可以在具有本地覆盖的任何机器(包括开发人员的机器)上创建一个 local.py 文件,并将此文件标记为源代码管理忽略,这样更改就不会被 checkin 。

    我们已经使用这种结构多年,它工作得非常好。

    关于django - 在 svn/hg/git/etc 中优雅地处理特定于站点的设置/配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1406892/

    相关文章:

    python - 如何测试 django 消息中是否存在某个级别

    具有 grep 功能的 Windows 单用户 SCM?

    javascript - Playwright - beforeEach 用于套件中的所有文件,或对所有测试的模拟响应

    python - 如何获取与 Django 中的外键关联的所有对象的列表

    mysql - 理解/mySQL 也就是在 Django 中欺骗外键关系

    php - 项目管理/多版本

    Git:如何确保未跟踪的配置文件不会被静默删除

    c# - 如何创建包含集合的配置节

    python - 在 Django 中将数据库对象转换为字符串

    没有 .git 目录的 Git 克隆