Django эквивалентно paster для внутренних процессов - PullRequest
1 голос
/ 02 мая 2010

Я использую пилоны в своей работе, но я новичок в Django. Я делаю приложение для фильтрации rss, и поэтому мне бы хотелось, чтобы два бэкэнд-процесса выполнялись по расписанию: один для сканирования RSS-каналов для каждого пользователя, а другой для определения релевантности отдельных сообщений относительно прошлых предпочтений пользователей. В пилонах я бы просто написал команды paster, чтобы обновить базу данных этими данными. Есть ли эквивалент в Django? Например, есть ли способ запустить эквивалент python manage.py shell в неинтерактивном режиме?

Ответы [ 3 ]

2 голосов
/ 03 мая 2010
1 голос
/ 03 мая 2010

Да, именно так я запускаю сценарии резервного копирования cron. Вам просто нужно загрузить virtualenv, если вы используете виртуальные среды и настройки вашего проекта.

Я надеюсь, что вы можете следовать этому, но после строки # manage.py shell вы можете написать свой код так же, как если бы вы были в manage.py shell

Вы можете импортировать свой virtualenv так:

import site

site.addsitedir(VIRTUALENV_PATH + '/lib/python2.6/site-packages')

Затем вы можете добавить проект django к пути

import sys

sys.path.append(DJANGO_ROOT)
sys.path.append(PROJECT_PATH)

Затем вы загружаете настройки django и chdir в проект django

import os

from django.core.management import setup_environ
from myproject import settings
setup_environ(settings)

os.chdir(PROJECT_PATH)

После этого момента ваша среда будет настроена так же, как если бы вы начали с manage.py shell

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

from application.models import MyModel

for element in MyModel:
    element.delete()

Вот мой резервный файл в полном объеме. Я абстрагировал процесс в функции. Он будет называться daily_backup и помещаться в папку cron.daily для ежедневного запуска. Вы можете увидеть, как настроить среду и изменить функциональность по мере необходимости.

#!/usr/bin/env python
import sys
import os
import site
import logging

from datetime import datetime

PROJECT_NAME = 'myproject'
DJANGO_ROOT = '/var/www/django'
PROJECT_PATH = DJANGO_ROOT + '/' + PROJECT_NAME
VIRTUALENV_PATH = '/var/www/envs/'+ PROJECT_NAME
BACKUP_DIR = '/var/www/backups/%s/daily' % (PROJECT_NAME)
TODAY = datetime.now().strftime('%Y%m%d-%H%M%S')
FILE_NAME = PROJECT_NAME + '_' + TODAY

site.addsitedir(VIRTUALENV_PATH + '/lib/python2.6/site-packages')
sys.path.append(DJANGO_ROOT)
sys.path.append(PROJECT_PATH)

from django.core.management import setup_environ
from myproject import settings
setup_environ(settings)

os.chdir(PROJECT_PATH)

# manage.py shell
from django.conf import settings

logging.basicConfig(level=logging.WARN)

def _setup():
    if not os.path.exists(BACKUP_DIR):
        logging.debug('Creating backup directory ' + BACKUP_DIR)
        os.mkdir(BACKUP_DIR)
        os.mkdir(BACKUP_DIR + '/databases')
    else:
        logging.debug('Using backup directory ' + BACKUP_DIR)

def _remove_old():
    logging.debug('Cleaning out old backups')
    # keep past 7 days
    command = "find %s* -name '%s*' -mtime +7 -exec rm {} \\;" % (BACKUP_DIR, PROJECT_NAME)
    os.system(command)

def _create_backup():
    logging.debug('Backup database')

    if settings.DATABASE_ENGINE == 'mysql':
        command = 'mysqldump -u %s --password=%s %s > %s/databases/%s.sql' % (settings.DATABASE_USER, settings.DATABASE_PASSWORD, settings.DATABASE_NAME, BACKUP_DIR, FILE_NAME)
    else:
        command = '%s/bin/python %s/manage.py dumpdata --indent=4 > %s/databases/%s.json' % (VIRTUALENV_PATH, PROJECT_PATH, BACKUP_DIR, FILE_NAME)

    os.system(command)

    logging.debug('Backup project')
    command = 'tar -czf %s/%s.tgz -C %s %s/' % (BACKUP_DIR, FILE_NAME, DJANGO_ROOT, PROJECT_NAME)
    os.system(command)


if __name__ == '__main__':
    _setup()
    _remove_old()
    _create_backup()
0 голосов
/ 14 января 2011

Звучит так, словно вам нужно немного twod.wsgi в вашей жизни: http://packages.python.org/twod.wsgi/

...