Как загрузить данные вне представления Django?
Если у меня есть несколько представлений Django, таких как 'first', 'second' и так далее, и я хочу загрузить некоторые данные вне этих представлений, но использовать их внутри представлений.
Вот пример, чтобы понять мою идею.
#function execution time is long, that is why i want to laod it only once when run programm.
fetched_data_from_postgres = some function which load data from postgres and return list with postgres data
def first(request):
#and the i want to use that previous value in all my views
fetched_data_from_postgres = do something
return HttpResponse("first VIEW")
def second(request):
#and the i want to use that previous value in all my views
fetched_data_from_postgres = do something
return HttpResponse("secondVIEW")
def third(request):
#and the i want to use that previous value in all my views
fetched_data_from_postgres = do something
return HttpResponse("third VIEW")
Этот подход хорошо работает, когда я запускаю свой проект django таким образом python manage.py runserver но когда я запускаю с gunicorn или wsgi, когда я могу указать количество рабочих, то когда рабочий меняется, эта переменная теряется и нужно обновить страницу, чтобы получить предыдущего рабочего для получения этих данных. Это просто смешно.
Или, может быть, есть какой-то другой подход для выполнения этой работы?
Этот подход не работает, когда вы запускаете проект локально с помощью python manage.py runserver, он работает только один раз, когда проект запускается, и затем вам нужно каждый раз перезагружать проект. Это происходит потому, что все в any_views.py загружается только один раз при запуске проекта, кроме ваших функций. Поэтому вам нужно перезапустить проект, чтобы обновить переменную fetched_data_from_postgres
лучший подход - создать скрипт fetch_script.py, переместить в него свою функцию some function which load data from postgres and return list with postgres data и вызывать ее внутри views.py, а не снаружи
Лучшим решением, чтобы избежать многократной загрузки данных и предотвратить двойное выполнение этой функции fetched_data_from_postgres, является использование кэш-фреймворка вместе с Django. Более подробную информацию можно найти в документации:
https://docs.djangoproject.com/en/stable/topics/cache/
Его относительно легко настроить, и он должен идеально решить вашу проблему. Если вы чувствуете, что это излишество, тогда вопрос в том, действительно ли вам нужна скорость? Вы уверены, что не пытаетесь преждевременно оптимизировать?