Django с несколькими настройками среды - PullRequest
0 голосов
/ 20 мая 2019

Я новичок в языке программирования Python 3.Я выбираю Django-2.1 и Djangorestframework для моих спокойных веб-сервисов.Я разделил проект на несколько сред, установив так же, как здесь .Код управляется таким образом, то есть локально, dev & prod, чтобы не изменять код.Просто передайте файл в переменную окружения.Для этого я удалил файл «settings.py», и новая структура файла выглядит следующим образом:

mybackend/
 |-- mybackend/
 |    |-- __init__.py
 |    |-- settings/
 |    |    |-- __init__.py
 |    |    |-- base.py
 |    |    |-- dev.py
 |    |    |-- prod.py   
 |    |-- urls.py
 |    +-- wsgi.py
 +-- manage.py

Над настройками файл содержит свойства базы данных, например, user, pass, host & port.

Теперь я хочу использовать эти свойства вне модуля 'models'.Есть ли способ получить файлы свойств базы данных?Или любым другим способом получить свойство DB и установить соединение с базой данных.

Я попытался прочитать настройку по умолчанию и попытаться загрузить динамически

class ConnUtil:
    def __init__(self):
        self.file_name = os.environ.get("DJANGO_SETTINGS_MODULE")
        self.host = ""
        self.user = ""
        self.password = ""
        self.database = ""
        self.port = 3306

    # a class method to create a object.
    @staticmethod
    def get_conn():
        file_name = os.environ.get("DJANGO_SETTINGS_MODULE")

        env_file = "backend_jio_games.settings"
        name = file_name;
        name = name[name.rfind('.')+1:]
        print(">>>>>> %r" % name)
        if name == 'local':
            print("Local")
            env_file = env_file+".local.py"
        elif name == 'dev':
            print("Dev")
            env_file = env_file + ".dev.py"
        elif name == 'replica':
            print("Replica")
            env_file = env_file + ".replica.py"
        else:
            print("Prod")
            env_file = env_file + ".prod.py"

        print(">>>>>>>>>>" +env_file)
        import env_file
        #myConnection = pymysql.connect(host=hostname, user=username, passwd=password, db=database, port=port)  # Mysql Connection
        #return myConnection

Но я получаю сообщение об ошибке типа «Нет».модуль с именем env_file '.

Я хочу установить соединение с базой данных в зависимости от среды.

Заранее спасибо

Ниже приведенное решение сработало для меня

from django.conf import settings
from django.db import connections
from django.db.utils import OperationalError
import logging
logger = logging.getLogger('django')


class ConnUtil:

    def __init__(self):
        logger.debug("Conn Util Object created...")
        self.cursor = None

    # a class method to create a object.
    def get_dbcursor(self):
        logger.debug(">>>>>> %r" % settings.DATABASES)
        db_conn = connections['default']
        try:
            self.cursor = db_conn.cursor()
        except OperationalError:
            logger.error("Error in opening cursor>>>>>>")

        return self.cursor

    def close_dbcursor(self):
        logger.debug("closing cursor>>>>>>")
        if self.cursor:
            self.close_cursor()
...