База данных Django Celery для моделей на продюсера и работника

Я хочу разработать приложение, которое использует Django в качестве Fronted и Celery для фоновой работы. Теперь иногда работникам Celery на разных машинах нужен доступ к базе данных на моей машине внешнего интерфейса django (два разных сервера). Им нужно знать некоторые вещи в реальном времени и запускать django-приложение с

python manage.py celeryd 

им нужен доступ к базе данных со всеми доступными моделями.

Должен ли я получить доступ к своей базе данных MySQL через прямое соединение? Таким образом, я должен разрешить пользователю «my-django-app» доступ не только с локального хоста на моем внешнем компьютере, но и с другого ips рабочего сервера?

Это «правильный» способ, или я что-то упустил? Просто подумал, что это не совсем безопасно (без ssl), но, может быть, так оно и должно быть.

Спасибо за ваши ответы!

Ответы на вопрос(1)

Решение Вопроса

Им потребуется доступ к базе данных. Этот доступ будет осуществляться через базу данных, которая может поставляться с Django илиодин от третьего лица.

Одна вещь, которую я сделал на моем сайте Djangosettings.py загрузить информацию о доступе к базе данных из файла в/etc, Таким образом, настройки доступа (хост базы данных, порт, имя пользователя, пароль) могут быть разными для каждой машины, а конфиденциальная информация, такая как пароль, отсутствует в репозитории моего проекта. Возможно, вы захотите ограничить доступ к сотрудникам аналогичным образом, подключив их с другим именем пользователя.

Вы также можете передать информацию о соединении с базой данных или даже просто ключ или путь к файлу конфигурации через переменные среды и обработать их вsettings.py.

Например, вот как я извлекаю файл конфигурации базы данных:

g = {}
dbSetup = {}
execfile(os.environ['DB_CONFIG'], g, dbSetup)
if 'databases' in dbSetup:
    DATABASES = dbSetup['databases']
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            # ...
        }
    }

Излишне говорить, что вам нужно убедиться, что файл вDB_CONFIG не доступен ни одному пользователю, кроме администраторов db и самого Django. Случай по умолчанию должен отсылать Django к собственной тестовой базе данных разработчика. Там также может быть лучшее решение, используяast модуль вместоexecfile, но я еще не исследовал это.

Еще одна вещь, которую я делаю, - это использование отдельных пользователей для задач администратора БД и всего остального. В моемmanage.pyЯ добавил следующую преамбулу:

# Find a database configuration, if there is one, and set it in the environment.
adminDBConfFile = '/etc/django/db_admin.py'
dbConfFile = '/etc/django/db_regular.py'
import sys
import os
def goodFile(path):
    return os.path.isfile(path) and os.access(path, os.R_OK)
if len(sys.argv) >= 2 and sys.argv[1] in ["syncdb", "dbshell", "migrate"] \
    and goodFile(adminDBConfFile):
    os.environ['DB_CONFIG'] = adminDBConfFile
elif goodFile(dbConfFile):
    os.environ['DB_CONFIG'] = dbConfFile

Где конфиг в/etc/django/db_regular.py для пользователя с доступом только к базе данных Django с SELECT, INSERT, UPDATE и DELETE, и/etc/django/db_admin.py для пользователя с этими разрешениями плюс CREATE, DROP, INDEX, ALTER и LOCK TABLES. (Themigrate команда отюг.) Это дает мне некоторую защиту от попадания кода Django в мою схему во время выполнения и ограничивает ущерб, который может нанести атака с использованием SQL-инъекции (хотя вам все равно следует проверять и фильтровать весь пользовательский ввод).

Это не решение вашей конкретной проблемы, но может дать вам несколько идей о том, как улучшить настройку доступа к базе данных Django для ваших целей.

 Mike DeSimone07 окт. 2010 г., 22:38
Вы также можете хранить вашиSECRET_KEY за пределамиsettings.py подать аналогичным образом.
 dotmoo07 окт. 2010 г., 21:05
Спасибо! Я думаю, что это хороший способ убедиться, что мой вход в базу данных находится в правильных руках.

Ваш ответ на вопрос