代码之家  ›  专栏  ›  技术社区  ›  GluePear

Django Docker中的单独设置文件[副本]

  •  0
  • GluePear  · 技术社区  · 5 年前

    我一直在开发一个基本的应用程序。现在在部署阶段,很明显我需要本地设置和生产设置。

    • 如何最好地处理开发和生产环境。
    • 如何将django调试工具栏等应用程序仅保留在开发环境中。
    • 开发和部署设置的任何其他提示和最佳实践。
    0 回复  |  直到 9 年前
        1
  •  99
  •   Thomas Orozco    5 年前

    这个 DJANGO_SETTINGS_MODULE environment variable

    因此,您可以为各自的环境创建单独的配置文件(注意,它们当然可以 import * 从一个单独的“共享设置”文件),并使用 控制使用哪一个。

    DJANGO_SETTINGS_模块的值应采用Python路径语法,例如mysite.SETTINGS。注意,设置模块应该位于Python导入搜索路径上。

    假设你创造了 myapp/production_settings.py myapp/test_settings.py 在源存储库中。

    在这种情况下,您将分别设置 DJANGO_SETTINGS_MODULE=myapp.production_settings 使用前者 DJANGO_SETTINGS_MODULE=myapp.test_settings 使用后者。


    DJANGO_设置模块 环境变量。

    设置 使用脚本或外壳

    export DJANGO_SETTINGS_MODULE=myapp.production_settings .

    请注意,您可以在任何时候从shell运行此导出,它不需要存在于 .bashrc

    设置 DJANGO_设置模块

    如果您不喜欢编写设置环境的引导脚本(而且有很好的理由这么认为!),我建议使用流程管理器:


    最后,请注意 可以 利用 PYTHONPATH /etc/ ). 这允许将配置与应用程序文件分离。你可能想要也可能不想要,这取决于你的应用程序的结构。

        2
  •  43
  •   cs01    7 年前

    默认情况下使用生产设置,但创建名为 settings_dev.py 与您的 settings.py DEBUG=True .

    在将用于开发的计算机上,将此添加到 ~/.bashrc 文件:

    export DJANGO_DEVELOPMENT=true
    

    设置.py 文件,添加以下内容。

    # Override production variables if DJANGO_DEVELOPMENT env variable is set
    if os.environ.get('DJANGO_DEVELOPMENT') is not None:
        from settings_dev import * 
    

    (注意,导入 * 在Python中通常应该避免,但这是一种独特的情况)

    默认情况下,生产服务器不会覆盖任何内容。完成!

    与其他答案相比,这个更简单,因为它不需要更新 PYTHONPATH ,或设置 DJANGO_SETTINGS_MODULE 一次只允许你做一个django项目。

        3
  •  34
  •   Daniel Watkins    12 年前

    我通常每个环境有一个设置文件和一个共享设置文件:

    /myproject/
      settings.production.py
      settings.development.py
      shared_settings.py
    

    我的每个环境文件都有:

    try:
        from shared_settings import *
    except ImportError:
        pass
    

    这允许我在必要时重写共享设置(通过在该节下面添加修改)。

    然后,我通过将其链接到settings.py来选择要使用的设置文件:

    ln -s settings.development.py settings.py
    
        4
  •  13
  •   Tryph    5 年前

    1. 在项目目录中创建文件夹并命名 settings .

      myproject/
             myapp1/
             myapp2/              
             myproject/
                    settings/
      
    2. 设置 __init__.py , base.py dev.py prod.py

      settings/
           __init__.py
           base.py
           prod.py
           dev.py 
      
    3. 正常开放 __初始年 并填写以下内容:

      from .base import *
      # you need to set "myproject = 'prod'" as an environment variable
      # in your OS (on which your website is hosted)
      if os.environ['myproject'] == 'prod':
         from .prod import *
      else:
         from .dev import *
      
    4. 正常开放 基.py

      基.py:

      import os
      ...
      INSTALLED_APPS = [...]
      MIDDLEWARE = [...]
      TEMPLATES = [{...}]
      ...
      STATIC_URL = '/static/'
      STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
      MEDIA_ROOT = os.path.join(BASE_DIR, '/path/')
      MEDIA_URL = '/path/'
      
    5. 正常开放 偏差py

      开发时间:

      DEBUG = True
      ALLOWED_HOSTS = ['localhost']
      ...
      
    6. 正常开放 包括特定于生产的材料,例如:

      生产日期:

      DEBUG = False
      ALLOWED_HOSTS = ['www.example.com']
      LOGGING = [...]
      ...
      
        5
  •  10
  •   Burhan Khalid    12 年前

    settings*.py 文件,外推每个环境需要更改的变量。在你主人的最后 settings.py 文件:

    try:
      from settings_dev import *
    except ImportError:
      pass
    

    你要分开 settings_* 每个阶段的文件。

    在你的顶端 settings_dev.py

    import sys
    globals().update(vars(sys.modules['settings']))
    

    导入需要修改的变量。

    wiki entry 对如何分割设置有更多的想法。

        6
  •  9
  •   Riccardo Leschiutta    7 年前

    我用的是超棒的 django-configurations ,所有设置都存储在 settings.py

    from configurations import Configuration
    
    class Base(Configuration):
        # all the base settings here...
        BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        ...
    
    class Develop(Base):
        # development settings here...
        DEBUG = True 
        ...
    
    class Production(Base):
        # production settings here...
        DEBUG = False
    

    为了配置Django项目,我只是按照 docs .

        7
  •  7
  •   Charlesthk    6 年前

    • settings 模块将设置拆分为多个文件,以便可读;
    • .env.json 用于存储要从git存储库中排除的凭据和参数的文件,或者存储特定于环境的凭据和参数的文件;
    • 一个 env.py .env.json文件 文件

    考虑到以下结构:

    ...
    .env.json           # the file containing all specific credentials and parameters
    .gitignore          # the .gitignore file to exclude `.env.json`
    project_name/       # project dir (the one which django-admin.py creates)
      accounts/         # project's apps
        __init__.py
        ...
      ...
      env.py            # the file to load credentials
      settings/
        __init__.py     # main settings file
        database.py     # database conf
        storage.py      # storage conf
        ...
    venv                # virtualenv
    ...
    

    比如:

    {
        "debug": false,
        "allowed_hosts": ["mydomain.com"],
        "django_secret_key": "my_very_long_secret_key",
        "db_password": "my_db_password",
        "db_name": "my_db_name",
        "db_user": "my_db_user",
        "db_host": "my_db_host",
    }
    

    以及 project_name/env.py

    <!-- language: lang-python -->
    import json
    import os
    
    
    def get_credentials():
        env_file_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        with open(os.path.join(env_file_dir, '.env.json'), 'r') as f:
            creds = json.loads(f.read())
        return creds
    
    
    credentials = get_credentials()
    

    我们可以进行以下设置:

    <!-- language: lang-py -->
    # project_name/settings/__init__.py
    from project_name.env import credentials
    from project_name.settings.database import *
    from project_name.settings.storage import *
    ...
    
    SECRET_KEY = credentials.get('django_secret_key')
    
    DEBUG = credentials.get('debug')
    
    ALLOWED_HOSTS = credentials.get('allowed_hosts', [])
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    
        ...
    ]
    
    if DEBUG:
        INSTALLED_APPS += ['debug_toolbar']
    
    ...
    
    # project_name/settings/database.py
    from project_name.env import credentials
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': credentials.get('db_name', ''),
            'USER': credentials.get('db_user', ''),
            'HOST': credentials.get('db_host', ''),
            'PASSWORD': credentials.get('db_password', ''),
            'PORT': '5432',
        }
    }
    

    此解决方案的好处是:

    • 特定于用户的凭据和配置
    • 特定于环境的配置 ,例如,您可以有三个不同的环境和三个不同的 像开发,停滞和生产;

    我希望这有帮助,如果你看到这个解决方案的任何警告,请告诉我。

        8
  •  4
  •   Felipe Buccioni    6 年前

    我使用以下文件结构:

    project/
       ...
       settings/
       settings/common.py
       settings/local.py
       settings/prod.py
       settings/__init__.py -> local.py
    

    __init__.py 是一个链接(在unix中为ln,在windows中为mklink) local.py 或者可以是 prod.py 所以配置仍然在 project.settings 模块是干净且有组织的,如果要使用特定的配置,可以使用环境变量 DJANGO_SETTINGS_MODULE project.settings.prod 如果需要为生产环境运行命令。

    在档案里 生产日期 :

    from .shared import *
    
    DATABASE = {
        ...
    }
    

    以及 shared.py 文件保持全局,没有特定的配置。

        9
  •  3
  •   Brian Lee    7 年前

    如果环境变量有问题,请将其值设置为字符串(例如 DJANGO_DEVELOPMENT="true" ).

    #settings.py
    import os
    if os.environ.get('DJANGO_DEVELOPMENT') is not None:
        from settings_dev import * 
    else:
        from settings_production import *
    #settings_dev.py
    development settings go here
    #settings_production.py
    production settings go here
    

    这样,Django在运行适当的设置文件之前不必读取整个设置文件。如果您的生产文件需要仅在生产服务器上的内容,则此解决方案非常有用。

    . 附加(例如。 from .settings_dev import * )

        10
  •  1
  •   Community Egal    7 年前

    如果要保留1个设置文件,并且开发操作系统与生产操作系统不同,则可以将其放在settings.py的底部:

    from sys import platform
    if platform == "linux" or platform == "linux2":
        # linux
        # some special setting here for when I'm on my prod server
    elif platform == "darwin":
        # OS X
        # some special setting here for when I'm developing on my mac
    elif platform == "win32":
        # Windows...
        # some special setting here for when I'm developing on my pc
    

    How do I check the operating system in Python?

        11
  •  1
  •   user7179686 user7179686    7 年前

    这似乎已经得到了回答,但是我与版本控制结合使用的方法如下:

    在本地开发环境中的设置所在的目录中设置env.py文件,我也将其添加到.gitignore:

    环境比:

    #!usr/bin/python
    
    DJANGO_ENV = True
    ALLOWED_HOSTS = ['127.0.0.1', 'dev.mywebsite.com']
    

    .gitignore:忽略:

    mywebsite/env.py
    

    if os.path.exists(os.getcwd() + '/env.py'):
        #env.py is excluded using the .gitignore file - when moving to production we can automatically set debug mode to off:
        from env import *
    else:
        DJANGO_ENV = False
    
    DEBUG = DJANGO_ENV
    

    我发现这是可行的,而且更优雅-使用env.py很容易看到我们的本地环境变量,并且我们可以在不使用多个settings.py文件或类似文件的情况下处理所有这些。这种方法允许使用各种我们不希望在生产服务器上设置的本地环境变量。通过版本控制使用.gitignore,我们还保持了所有内容的无缝集成。

        12
  •  0
  •   Alex Yursha    5 年前

    使用 settings.py 用于生产。在同一目录中创建 settings_dev.py 用于覆盖。

    # settings_dev.py
    
    from .settings import * 
    
    DEBUG = False
    

    在dev机器上运行Django应用程序:

    DJANGO_SETTINGS_MODULE=<your_app_name>.settings_dev python3 manage.py runserver
    

    设置.py 没有别的了。

    优势

    1. (用于生产)完全不可知任何其他环境甚至存在的事实。
    2. 设置\u dev.py settings_prod.py , 设置\u dev.py settings_shared.py .
    3. 如果有人在解决生产问题后向prod配置中添加了设置,那么您可以放心,它也会出现在您的dev配置中(除非显式重写)。因此,不同配置文件之间的差异将最小化。
        13
  •  -1
  •   Massimo Variolo    8 年前

    import socket
    
    [...]
    
    DEV_PC = 'PC059'
    host_name = socket.gethostname()
    
    if host_name == DEV_PC:
       #do something
       pass
    elif [...]