@Evgeny_A

Как использовать один экземпляр переменной в разных приложения Django?

Всем привет.

У меня есть переменная большого размера которую я загружаю единожды, чтобы ускорить обработку запросов пользователей. Вот файл project/app1/apps.py

from django.apps import AppConfig

class Config(AppConfig):
    data = load_data()

Далее в любой модели очень легко получить к этим данным доступ:

from django.apps import apps

settings = apps.get_app_config('app1')
# Здесь данные, которые я присвоил переменной в apps.py
data = settings.data

Проблемы начались, когда мне нужно было обратится к data из другого приложения. Когда я обращаюсь к settings.data из другого приложения, то большие данные загружаются с нуля и в памяти висит два экземпляра одной переменной. Это занимает много места и обновления одного экземпляра не доступны в другом.

Вопрос в том, как так единоразово загрузить данные в одном приложении, чтобы оно и другие приложения использовали один экземпляр переменной? Мне нужно хранить в памяти общий набор данных, чтобы изменения были доступы мгновенно для всех приложений.
  • Вопрос задан
  • 43 просмотра
Пригласить эксперта
Ответы на вопрос 2
JRazor
@JRazor
Senior StarkOverFlow Programmer
По описанию - проблема должна решать совершенно не так, как описана в вопросе.

  1. Помещаете данные в файл
  2. Создаёте singleton класс над приложением
  3. Грузите файл там
  4. Ипортируете класс когда и где нужно


Зачем пихать его в app - непонятно. Как будто он прям обязан увидеть, что у вас Django стоит, пощупать её, потрогать, а потом запуститься. Читайте SoC
Ответ написан
@pyHammer
Evgeny_A у django уже есть похожий механизм в приложении сайтов. Вы должны сделать что-то вроде этого:
# file_1.py
BIG_VAR = []

class BigVarClass:
    @staticmethod
    def get_big_var(self):
        return BIG_VAR
    @staticmethod
    def set_big_var(self, big_var):
        global BIG_VAR
        BIG_VAR = big_var

# file_2.py
from .file_1 import BigVarClass

BIG_VAR = BigVarClass.get_big_var()

Грубый пример, но работает это как-то так
Ну и собственно ссылка на github django/contrib/sites/models.py
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы