Загружать статические данные при запуске django с помощью готового метода AppConfig в Django 1.7

У меня есть некоторые статические данные о местоположении для загрузки, чтобы они были доступны во всем приложении, например, в кеше в памяти.

Я попытался переопределить ready() в AppConfig, но данные не загружаются из базы данных, а также дважды вызывается ready().

from django.apps import AppConfig


class WebConfig(AppConfig):
    name = 'useraccount'
    verbose_name = 'User Accounts'
    locations = []

   def ready(self):
        print("Initialising...")
        location = self.get_model('Location')
        all_locations = location.objects.all()
        print(all_locations.count())
        self.locations = list(all_locations)

любые намеки?


person Chirdeep Tomar    schedule 07.12.2014    source источник


Ответы (2)


Ну, документы ( https://docs.djangoproject.com/en/1.7/ref/applications/#django.apps.AppConfig.ready ) сообщают вам, что следует избегать использования вызовов базы данных в функции ready(), а также о том, что ее можно вызывать дважды.

Избежать двойного вызова легко:

def ready(self):
    if self.has_attr('ready_run'): return
    self.ready_run = True
    ...

Но я все еще пытаюсь найти правильный способ инициализации на основе базы данных. Я обновлю, если найду что-нибудь.

person Andrew Hows    schedule 21.01.2015
comment
Неа. Насколько я могу судить, запуск базы данных во время загрузки не поддерживается. В конечном итоге я решил свою проблему, переписав ее в команду управления, которая запускалась при развертывании. Команда управления генерировала данные и сохраняла их в базе данных, после чего приложение могло извлекать их из базы данных. - person Andrew Hows; 07.04.2015

Для загрузки некоторых статических данных в приложение создайте отдельный файл для получения данных.

# file /app_util.py
def get_country():
    if Student.objects.all().count == 0:
       ... # your code 
    else:
       ...  # your code

импортируйте app_util и вызовите его из url.py

# file /url.py
admin.autodiscover()
urlpatterns = patterns('equity_funds_investor_app',
                       # Examples:
                       url(r'^$', 'views.index'),
                      )
# make a call to save/get method
app_util.get_country()

Примечание: тот же процесс, которому вы можете следовать, когда вы хотите сохранить/получить некоторые данные при запуске файла url.py вашего приложения, обрабатывается только один раз, когда вы делаете первый запрос после сервера запуска и вызываете свои пользовательские функции.

person GrvTyagi    schedule 25.04.2015