2009-12-31 2 views
3

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

  • Положить их в файл с параметром настройки.py не работает. Кажется, это вызовет циклическую зависимость.
  • Положить их в файл __init__.py не работает. сервер Django называют его во много раз (В чем причина?)
+0

ссылаясь на '__init __. Py', он будет вызываться каждый раз при импорте этого модуля или если сервер перезагружает его. – Geo

ответ

1

Для одной операции в StartServer, вы можете использовать customs commands или если вы хотите периодическую задачу или очереди taske вы можете использовать celery

0

__init__ .py будет вызываться каждый раз, когда приложение будет импортировано. Поэтому, если вы используете mod_wsgi с Apache, например, с помощью метода prefork, каждый созданный процесс эффективно запускает проект, импортируя __init__.py. Похоже, ваш лучший метод заключается в создании новой команды управления, а затем cron, чтобы запускать все так часто, если это вариант. Либо это, либо запустите эту команду управления перед запуском сервера. Вы можете написать быстрый скрипт, который запускает эту команду управления, а затем запускает сервер, например.

6

Я просто создаю автономные скрипты и планирую их с помощью cron. По общему признанию, это немного низкотехнологичные, но это просто работает. Просто поместите это в начало скрипта в свой каталог верхнего уровня проектов и вызовите по мере необходимости.

#!/usr/bin/env python 
from django.core.management import setup_environ 
import settings 
setup_environ(settings) 
from django.db import transaction 

# random interesting things 
# If you change the database, make sure you use this next line 
transaction.commit_unless_managed() 
+0

Я думаю, что если вы используете работу cron, лучше использовать сельдерей. – diegueus9

+2

@ diegueus9: Хорошо, * почему * сельдерей лучше? В частности? Я искал его, и кажется ... не совсем готов к прайм-тайм. Когда я делаю вещи для производства, я получаю * очень консервативный *. Я видел waaay слишком много замечательных Next Great Things, которые каким-то образом не оправдали моих ожиданий. Крон может быть грубым/загадочным для нового пользователя, но я использовал его в течение 20 лет, и он прочен как камень. Это то, что я хочу в производстве. –

+1

@peter ИМХО, я думаю, потому что: 1) Является приложением для django 2) Сельдерей имеет очередь задач, cron not. 3) Возможно, потому что во всех ОС нет cron. 4) есть много функций, которые, как мне кажется, будут сложными с cron http://celeryproject.org/introduction.html#features 5) Я думаю, что архитектура клиент/сервер сельдерея и рабочие более мощные, чем работы cron , Кстати, извините за мой плохой английский. – diegueus9

4

Ставит скрипты запуска разовых в верхнем уровне urls.py. Это часто бывает, когда ваши привязки администратора идут - это тоже одноразовый запуск.

Некоторым людям нравится помещать эти вещи в settings.py, но это похоже на то, чтобы скомпоновать настройки (которые не так много) с остальной частью кода сайта (что делает вещи).

+0

Я попытался поместить метод init в urls.py, но кажется, что он не будет вызываться перед любым посещением – user192048

Смежные вопросы