如何为生产和暂存服务器动态更改Django项目设置.py



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

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

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

通过原始查询检索数据库中的信息。我不能将ORM用于此项目。

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

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

我需要创建一个机制来检测服务器是生产还是暂存,并在此基础上执行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',
}
}

PROD SERVER

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的解决方案。

有什么建议吗?

快速解决方案,创建一个返回游标的公共函数,对于生产,它将返回一个游标用于生产,对于统计,它返回一个cusror用于暂存,并在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')

最新更新