В Django, как я могу запросить отдельный проект из моего основного проекта? - PullRequest
0 голосов
/ 13 апреля 2011

У меня есть проект (# 1) с парой приложений в нем, использующий базу данных MySQL № 1. У меня также есть другой проект (# 2), чей код django находится на том же сервере, но он использует другую базу данных mysql (# 2).

Моя цель - запустить веб-приложение в проекте № 1 и использовать модели django из проекта № 2 для простого запроса к базе данных № 2. Однако, когда я импортирую из проекта № 2, он все еще использует базу данных № 1, хотя файл settings.py для № 2 соответственно использует базу данных № 2 (т.е. когда я запускаю веб-приложение в проекте № 2, он работает нормально ).

Вот полный файл, который я могу успешно запустить как отдельный скрипт. К сожалению, когда я импортирую файл в проект # 1 и запускаю функцию, он выходит из строя (потому что он ищет в db # 1 таблицу):

import sys

def get_stuff_from_project2(ids):
    from django.core.management import setup_environ
    from project2 import settings
    setup_environ(settings)

    from project2.myapp2.models import mymodel2

    all_rows = mymodel2.objects.filter(id__in=ids).values()
    return(all_rows)

# as a standalone script, run the main function
if __name__ == "__main__":
    sys.path.append("/home/me/django")
    print str ( get_stuff_from_project2( sys.argv[1:] ) )

Опять же, это работает как отдельный скрипт. Но из проекта № 1 (с использованием приведенного ниже кода) он завершается с ошибкой DatabaseEr. Таблица 'db1.myapp2_mymodel2' не существует:

from project1.myapp1.standalone_script import get_stuff_from_project2
all_rows = get_stuff_from_project2( ids )

Я предполагаю, что функция setup_environ фактически не обрабатывает новое DATABASE_NAME или что она не может изменить существующее DATABASE_NAME после установки настроек?

В этот момент я немного растерялся и пытался найти решение. Я на самом деле не хочу идти в ногу с подходом «несколько сайтов» или «несколько баз данных», так как мне бы очень хотелось, чтобы проект 1 и проект 2 были как можно более раздельными. Мой альтернативный вариант - вызвать автономный скрипт как системный вызов из проекта 1 или создать представление в проекте 2, которое представляет собой API и отправляет данные. Но я подумал, что простое использование модели было бы проще, если бы она работала.

Спасибо.

------- добавлено 13 апреля, 11:35 PST ----

Вот более простая версия вопроса: как я могу получить доступ к двум разным проектам из одного автономного скрипта. Следующий код работает нормально для любого проекта, в котором я сначала выполняю setup_environ, но он не может выполнить второй:

import sys
from django.core.management import setup_environ
sys.path.append('/home/me/django')

from project1 import settings
print setup_environ(settings)  # shows /home/me/django/project1
print settings.DATABASE_NAME   # shows db1
from project1.myapp1.models import mymodel1
mymodel1.objects.filter(id=9376544).values()  # works fine

from project2 import settings
print setup_environ(settings)  # shows /home/me/django/project2
print settings.DATABASE_NAME   # shows db2
from project2.myapp2.models import mymodel2
mymodel2.objects.filter(id=6544).values() # fails with:
# django.db.utils.DatabaseError: (1146, "Table 'db1.myapp2_mymodel2' doesn't exist")

Ответы [ 2 ]

0 голосов
/ 09 ноября 2011

Мне не удалось решить эту проблему с помощью одного сценария. Вместо этого я использовал два сценария: первый вызывал второй как команду оболочки, а второй выводил отформатированные данные в виде списка в стандартный вывод.

Это было достаточно надежно для проблемы чтения одного потока данных из базы данных другого приложения, но не подходит для более масштабной задачи, такой как требование нескольких запросов или запись данных второго приложения. Для более сложной проблемы, добавьте API (XMLRPC, REST легко в Django), чтобы делать вызовы в запущенные приложения.

0 голосов
/ 13 апреля 2011

Вы должны добавить этот другой проект в ваш pythonpath (например, в вашем файле wsgi, если вы используете mod_wsgi, или в файле projects.py, если вы хотите получить доступ к этому проекту в «оболочке python manage.py» тоже). Если вы сделали это, оно работает как волшебство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...