Как перезапустить проект django без обновления данных сеанса, хранящихся в пространстве процесса / потока?

#django #serialization #django-rest-framework #django-views #django-serializer

#django #сериализация #django-rest-framework #django-представления #django-serializer

Вопрос:

В моем проекте django я сохраняю экземпляр сложного класса в пространстве потоков. Этот экземпляр трудно сериализовать, поэтому его нельзя сохранить в базе данных и возобновить из базы данных.

При поступлении запроса экземпляр используется для ответа.

Когда я обновляю код, я хочу перезагрузить проект без обновления экземпляра. Поскольку экземпляр хранит много информации, для повторного создания которой требуется очень много времени.

Есть ли какой-либо способ сохранить экземпляр (объект, который нельзя сериализовать) при перезагрузке проекта django?

Или есть какой-либо способ сохранить экземпляр и возобновить его, который не может быть сохранен в базе данных?

Ответ №1:

Загляните в структуру кэша django. https://docs.djangoproject.com/en/3.1/topics/cache /

Во время разработки можно выбрать redis, filebased, database или local ram.

пример в settings.py

 CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
    }
}
 

Если вы не хотите кэшировать во время работы над сложным экземпляром, используйте «фиктивный» кэш без кэширования.

 CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
    }
}
 

используя это в представлениях

 from django.core.cache import cache

cache.set('my_key', complex_instance, 30)

complex_instance = cache.get('my_key')
 

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

1. Спасибо за ваш своевременный ответ. Я проверю, может ли этот метод решить мою проблему.

2. Какая жалость. Я хочу сохранить сложный экземпляр с cache.set помощью и получить его cache.get . Я нашел информацию в документе django об этом value can be any picklable Python object. . Как я упоминал выше, сложный экземпляр невозможно сериализовать и десериализовать. Я думаю, что этот метод не работает в этой ситуации.

3. Через два дня мне все еще интересно, какой объект не может быть сериализован? Может быть, поможет другой формат, например, json? Он очень большой? Пожалуйста, дайте мне знать, если вы когда-нибудь решали эту проблему.