Django: Объекты, которые живут в течение всего времени работы сервера

У меня есть некоторые данные в формате csv, которые нужно загрузить в приложение один раз, а затем использовать их повторно в течение всего времени работы приложения, то есть через несколько запросов. Как я могу это сделать?

Очевидный для меня способ - иметь модуль, который будет загружать данные, а затем выставлять их. Однако мне не нравится, когда модули выполняют много работы, потому что тогда импорт приводит к неожиданным побочным эффектам. Я хотел бы выполнять эту одноразовую работу предсказуемым, детерминированным образом, а не потому, что кто-то импортировал модуль.

Предоставляет ли Django какие-то крючки для глобальных данных? Какой-то класс приложения/сервиса, в котором я мог бы выполнять эту работу, а затем получать доступ к данным в запросах?

Вы можете использовать AppConfig для инициализации данных: (См. https://docs.djangoproject.com/en/5.1/ref/applications/)

class MyConfig(AppConfig):
    name = 'my_app'

    def ready(self):
        self.my_data = ...  # Read data here

Вы можете получить данные в коде ваших представлений:

from django.apps import apps

def my_view(request, ...):
    my_var = apps.get_app_config('my_app').my_data

Но, на мой взгляд, это неоправданно сложно. Лучше сделать это в модуле, как вы сами указываете:

# Note: the code below is not in a function or a class, but directly in the module!
# It will be executed only once when the server starts and the file is imported,
# `my_data` will continue to exist throughout server lifetime.

my_data = ... # Read data here.

def my_view(request, ...):
    my_var = my_data[...]  # You can use the data here 

И вы можете импортировать данные в любой другой модуль, я не вижу причин, почему это может привести к «неожиданным побочным эффектам», если только вы убедитесь, что не вводите циклический импорт:

from my_module import my_data

def my_view(request, ...):
    my_var = my_data[...]  # You can use the data here 

Таким образом, my_data будет инициализироваться «предсказуемым, детерминированным образом».

Вернуться на верх