Django: вызов метода только один раз при запуске django

Я хочу инициализировать некоторые переменные (из базы данных) при запуске Django.

Я могу получить данные из базы данных, но проблема в том, как мне вызвать метод инициализации. И это нужно вызывать только один раз.

Пытался поискать на других страницах, но не нашел на него ответа.

В настоящее время код выглядит примерно так:


def get_latest_dbx (запрос, ....):

# получить данные из базы данных


def get_latest_x (запрос):

get_latest_dbx (запрос, x, ...)


def запуск (запрос):

get_latest_x (запрос)


person Himanshu    schedule 25.01.2013    source источник
comment
Взгляните на это .. stackoverflow.com/a/16111968/7321201   -  person nishant    schedule 08.09.2017


Ответы (2)


Некоторые люди предлагают (Выполнять код, когда Django запускается только ОДИН РАЗ?). эта инициализация в urls.py верхнего уровня (что выглядит необычно, поскольку urls.py должен обрабатывать шаблон URL). Есть еще один обходной путь - написать промежуточное ПО: Где разместить код запуска Django? Но я считаю, что большинство людей ждут решения проблемы .

ОБНОВИТЬ:

Поскольку OP обновил вопрос, кажется, что способ промежуточного программного обеспечения может быть лучше, поскольку ему действительно нужен объект request при запуске. Все коды запуска могут быть помещены в метод process_request пользовательского промежуточного программного обеспечения, где объект request доступен в первом аргументе. После выполнения этих кодов запуска может быть установлен некоторый флаг, чтобы избежать их повторного запуска позже (исключение MiddlewareNotUsed работает только в __init__, который не получает аргумент request).

Кстати, требование OP выглядит немного странно. С одной стороны, ему нужно инициализировать некоторые переменные при запуске Django, с другой стороны, ему нужен объект request при инициализации. Но когда Django запускается, входящего запроса может вообще не быть. Даже если он есть, в этом нет особого смысла. Я предполагаю, что на самом деле ему нужно выполнить некоторую инициализацию для каждого сеанса или пользователя.

person Hui Zheng    schedule 25.01.2013
comment
Я пробовал позвонить с верхнего уровня urls.py. Но функции нужен объект запроса. Как мне получить это в urls.py ?? - person Himanshu; 28.01.2013
comment
На самом деле метод, который получает список записей из базы данных и отображает их (записанные на заказ), нуждается в request.session, поэтому мне нужно передать объект запроса. Будет ли объекту запроса (из process_request) назначена переменная сеанса? - person Himanshu; 28.01.2013
comment
Конечно, вы можете получить сеанс из свойства запроса, то есть request.session, пока SessionMiddleware включен. - person Hui Zheng; 28.01.2013
comment
Я не могу получить объект запроса. SessionMiddleware включен. - person Himanshu; 28.01.2013
comment
Вы поместили django.contrib.sessions в свои INSTALLED_APPS и поместили django.contrib.sessions.middleware.SessionMiddleware в MIDDLEWARE_CLASSES? - person Hui Zheng; 28.01.2013
comment
Как мне получить доступ к request_object? Мне нужно создать process_request ()? - person Himanshu; 29.01.2013
comment
Нет, объект запроса будет доступен в любом промежуточном программном обеспечении. Как только вы создадите класс промежуточного программного обеспечения, просто поместите логику инициализации в его process_request метод. Помните, что фреймворк django (как и любой другой фреймворк) будет передавать объект запроса этому методу, вам никогда не нужно создавать его самостоятельно, что называется IoC (Inversion of Control). - person Hui Zheng; 29.01.2013
comment
Пробовал много, все никак не получается. Он по-прежнему говорит о неопределенной глобальной переменной. вы можете вставить фрагмент кода? - person Himanshu; 30.01.2013
comment
undefined глобальная переменная означает, что вы ссылаетесь на переменную, которая никогда не определялась. Вероятно, вы забыли добавить request в process_request. В промежуточном программном обеспечении это должно быть похоже на def process_request(self, request): do_sth_with(request) - person Hui Zheng; 30.01.2013

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

Вы когда-нибудь пробовали положить print 'haha' в файлы settings.py :)?

Примечание. имейте в виду, что settings.py запускается дважды во время запуска.

person Thai Tran    schedule 25.01.2013
comment
Выполнить дважды - не проблема, но во время запуска мне нужно вызвать функцию, которой нужен объект «запрос». Это будет возможно? - person Himanshu; 28.01.2013