В django, как мне запросить отдельный проект из моего основного проекта?

#django

#django

Вопрос:

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

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

Вот полный файл, который я могу успешно запустить как отдельный скрипт. К сожалению, когда я импортирую файл в project # 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 (используя приведенный ниже код) он завершается ошибкой DatabaseError, таблица ‘db1.myapp2_mymodel2’ не существует:

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

Я предполагаю, что функция setup_environ фактически не обрабатывает новое ИМЯ_БАЗЫ данных или что она не может изменить существующее ИМЯ_БАЗЫ данных после установки настроек?

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

Спасибо.

——- добавлено 13 апреля, 11:35 по тихоокеанскому времени —-

Вот более простая версия вопроса: как я могу получить доступ к двум разным проектам из одного автономного скрипта. Следующий код работает нормально для любого проекта, в котором я сначала выполняю 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")
  

Ответ №1:

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

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

Ответ №2:

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

Комментарии:

1. Но оба проекта # 1 и проект # 2 уже находятся в одном и том же пути python (я отредактировал свой код выше и переместил оператор sys.path.append в основное условие вместо этого, чтобы сделать его более понятным). Моя структура каталогов выглядит следующим образом: /home/me /django/project1 и /home / me / django /project2 и /home / me / django уже находятся в моем python path.