首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django -运行(切换)dev/调试/产品模式的最佳实践?

Django -运行(切换)dev/调试/产品模式的最佳实践?
EN

Stack Overflow用户
提问于 2021-08-13 04:13:42
回答 3查看 199关注 0票数 0

在我的源代码(使用Docker)中,有一个数据库和我的django代码。

docker-compose.yml

代码语言:javascript
复制
services: 
    app:

    db:

在本地调试时,通常会删除中的数据库,以防止它在本地创建新数据库。然后更改django源代码中的设置,以连接到服务器的数据库。

settings.py

代码语言:javascript
复制
  DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'HOST': 123.231.***,
        'NAME': db***,
        'USER': ****,
        'PASSWORD': ****
    }
}

或者,当我开发一个新特性时,我更愿意在本地创建一个数据库来测试我们的东西,而不是直接连接到服务器数据库。

好吧,我的问题是如何设置,以便我们可以轻松地切换之间的dev/ prod/调试模式。

在我看来,这应该像命令一样简单:

代码语言:javascript
复制
python manage.py run dev-mode
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-08-13 05:06:48

在项目根目录中创建设置文件夹,并创建4个文件:_base.py、dev.py、test.py、prod.py

将所有设置从原始的_base.py移动到settings.py (并删除它)。然后,在每个剩余的设置中,文件创建您的环境特定的信任。

对于exapmle:

settings/_base.py

代码语言:javascript
复制
### import statements

BASE_DIR = Path(__file__).resolve().parent.parent.parent


def get_secret(setting):
    """Get the secret variable or return explicit exception."""
    try:
        return os.environ[setting]
    except KeyError:
        error_msg = f'Set the {setting} environment variable'
        raise ImproperlyConfigured(error_msg)

### other settings 

settings/dev.py

代码语言:javascript
复制
from ._base import *

DEBUG = True

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': get_secret('DATABASE_NAME'),
        'USER': get_secret('DATABASE_USER'),
        'PASSWORD': get_secret('DATABASE_PASSWORD'),
        'HOST': 'db',
        'PORT': '5432',
    }
}

然后分别为不同的环境创建脚本dev/test/prod。考虑到你用的是码头作曲。下面是开发环境build_dev.sh的示例

代码语言:javascript
复制
#!/usr/bin/env bash
DJANGO_SETTINGS_MODULE=my_project.settings.dev \
DJANGO_SECRET_KEY='super_secret_django_key' \
DATABASE_NAME=my_db \
DATABASE_USER=my_db_user \
DATABASE_PASSWORD="my_db_user_password" \
docker-compose up --detach

以这种方式,您只需要执行必要的脚本,就这样

票数 4
EN

Stack Overflow用户

发布于 2021-08-13 04:47:05

我使用了两个不同的设置文件和所需的配置-

)

  • dev_settings.py (具有生产env的设置)
  1. settings.py (具有本地env设置)

现在,我还创建了一个名为 manage.py 文件的副本,名为local.py,并通过更改manage.py中的以下代码行将其连接到dev_settings.py

代码语言:javascript
复制
def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project_name.dev_settings')

因此,每当我在本地运行我的应用程序时,我就使用

代码语言:javascript
复制
python local.py makemigrations

代码语言:javascript
复制
python local.py runserver
票数 1
EN

Stack Overflow用户

发布于 2021-08-13 08:06:39

仅仅这样做有什么不对:

代码语言:javascript
复制
if DEBUG:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'db.sqlite3',
    }
}
else:
    DATABASES = {
        "default": {
            "ENGINE": "django.db.backends.postgresql",
            "NAME": os.getenv("POSTGRES_DB"),
            "USER": os.getenv("POSTGRES_USER", "hello"),
            "PASSWORD": os.getenv("POSTGRES_PASSWORD", "password"),
            "HOST": os.getenv("POSTGRES_HOST", "localhost"),
            "PORT": os.getenv("POSTGRES_PORT", "5432"),
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68766668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档