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
будет инициализироваться «предсказуемым, детерминированным образом».