【问题标题】:How to change Django project settings.py dynamically for production and staging servers如何为生产和登台服务器动态更改 Django 项目 settings.py
【发布时间】:2021-06-08 03:24:12
【问题描述】:

在我当前的项目中,我有两台服务器:productionstaging

staging 服务器使用默认的 MySQL Django 连接器。

production 服务器为 MariaDB 使用自定义连接器。

通过原始查询检索数据库中的信息。我不能在这个项目中使用 ORM。

stagingproduction 都连接到项目的 git 存储库。

如果我使用暂存服务器的特定设置推送提交,当我从生产服务器 git pull 时它将不起作用,反之亦然。

我需要创建一种机制来检测服务器是生产还是暂存,并据此执行 MariaDB 或 MySQL 的特定代码。

冲突文件是:settings.py(无需解释)和db.py(包含数据库的所有逻辑,这里实现了负责查询数据库的函数)。

暂存服务器

db.py(截断):

#!/usr/bin/python
from django.db import connection
import re
from collections import namedtuple

def get_genome_id_from_start_value(start):
    results = []
    cursor = connection.cursor()
    cursor.execute("SELECT record_id FROM `db-dummy`.g_info WHERE start = %s", ('{}%'.format(start),))
    columns = [column[0] for column in cursor.description]
    results = []
    for row in cursor.fetchall():
        results.append(dict(zip(columns, row)))
    return results[0]['record_id']

settings.py(截断):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db-dummy',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': '',
        'TIME_ZONE': 'UTC',
    }
}

产品服务器

db.py(截断)

#!/usr/bin/python
import mariadb 
import re
from collections import namedtuple

def get_genome_id_from_start_value(start):
    conn = mariadb.connect(
        user="user",
        password="password",
        host="localhost",
        database="db-dummy")
    results = []
    cursor = conn.cursor(named_tuple=True)
    try:
        cursor.execute("SELECT record_id FROM `db-dummy`.g_info WHERE start = ?", (start,))
        columns = [column[0] for column in cursor.description]
        results = []
        for row in cursor.fetchall():
            results.append(dict(zip(columns, row)))
        return results[0]['record_id']
    except mariadb.Error as e:
        print(f"Error: {e}")

settings.py(截断):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

我尝试过的:

settings.py:

STAGING = 'staging'
PROD = 'prod'

if socket.gethostname().startswith('ip-177-77-7-777'):
    DJANGO_HOST = STAGING
else:
    DJANGO_HOST = PROD

if PROD == DJANGO_HOST:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'db-dummy',
            'USER': 'user',
            'PASSWORD': 'password',
            'HOST': '127.0.0.1',
            'PORT': '',
            'TIME_ZONE': 'UTC',
        }
    }

我认为这适用于 settings.py,但现在我需要一个适用于 db.py 的解决方案。

有什么建议吗?

【问题讨论】:

    标签: python django


    【解决方案1】:

    快速解决方案, 创建一个返回游标的通用函数,对于生产,它将返回一个用于生产的游标,对于 statging 它返回一个用于暂存的游标,并在 get_genome_id_from_start_value 中使用此游标。

    from django.conf import settings
        def get_cursor():
            if settings.PROD == settings.DJANGO_HOST:
                conn = mariadb.connect(
                user="user",
                password="password",
                host="localhost",
                database="db-dummy")
            return conn.cursor(named_tuple=True)
            else:
               return cursor = connection.cursor()
        def get_genome_id_from_start_value():
           cursor  = get_cursor()
           ----
    

    一个更好的使用django_environ的方法,然后你可以定义环境sepecfic常量,数据库到一个文件 并且可以在 python 文件中使用这些值 https://pypi.org/project/django-environ/

    .env
    DJANGO_HOST=PROD
    DEBUG=false
    ----
    
    .env
    DJANGO_HOST=STAGING
    DEBUG=on
    -----
    
    settings.py
    environ.Env.read_env()
    env = environ.Env(DEBUG=(bool, False))
    DEBUG = env('DEBUG')
    DJANGO_HOST = env('DJANGO_HOST')
    

    【讨论】:

    • 好主意!我一直在寻找类似的东西。但是有一个问题,settings.pydb.py 在不同的文件夹中。如果文件位于不同的文件夹中,我如何获得 DJANGO_HOST 值?
    • django.conf 导入设置,使用 settings.DJANGO_HOST
    • 另一个技巧是创建多个设置文件并更改 WSGI 和 manage.py 以包含正确的设置文件
    猜你喜欢
    • 2016-01-03
    • 1970-01-01
    • 2013-09-14
    • 2018-09-28
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    相关资源
    最近更新 更多