Как загрузить данные вне представления 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/

Его относительно легко настроить, и он должен идеально решить вашу проблему. Если вы чувствуете, что это излишество, тогда вопрос в том, действительно ли вам нужна скорость? Вы уверены, что не пытаетесь преждевременно оптимизировать?

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