Django entspricht paster für Back-End-Prozesse
Frage
Ich benutze Pylonen in meinem Job, aber ich bin neu in django. Ich mache einen RSS-Anwendung Filterung, und so würde Ich mag zwei Back-End-Prozesse haben, die auf einem Zeitplan ausgeführt: ein zu kriechen RSS-Feeds für jeden Benutzer und eine andere Relevanz einzelner Beiträge in Bezug auf Benutzer Vergangenheit Präferenzen zu bestimmen. In Pylonen, würde ich nur schreiben Paster Befehle die DB mit diesen Daten zu aktualisieren. Gibt es ein Äquivalent in django? EG ist es eine Möglichkeit, um das Äquivalent von python manage.py shell
in einem nicht-interaktiven Modus laufen zu lassen?
Lösung
Ja, das ist tatsächlich, wie ich meinen cron Backup-Skripte ausgeführt werden. Sie müssen nur Ihre virtualenv laden, wenn Sie virtuelle Umgebungen und Ihre Projekteinstellungen verwenden.
Ich hoffe, dass Sie diese folgen können, aber nach der Linie # manage.py shell
können Sie Ihren Code schreiben, als ob Sie in manage.py shell
waren
Sie können Ihre virtualenv wie so importieren:
import site
site.addsitedir(VIRTUALENV_PATH + '/lib/python2.6/site-packages')
Sie können dann das django Projekt auf den Pfad
hinzufügenimport sys
sys.path.append(DJANGO_ROOT)
sys.path.append(PROJECT_PATH)
Als nächstes laden Sie die django Einstellungen und chdir zum django Projekt
import os
from django.core.management import setup_environ
from myproject import settings
setup_environ(settings)
os.chdir(PROJECT_PATH)
Nach diesem Punkt wird Ihre Umgebung eingestellt wird genau wie wenn Sie mit manage.py shell
gestartet
Sie können dann läuft alles so, als ob Sie in der interaktiven Shell waren.
from application.models import MyModel
for element in MyModel:
element.delete()
Hier ist meine Backup-Datei in voller Höhe. Ich habe den Prozess hinaus in Funktionen abstrahiert. Dies würde daily_backup
benannt und in den cron.daily
Ordner abgelegt werden täglich ausgeführt werden soll. Sie können sehen, wie die Umgebung einzurichten und die Funktionalität nach Bedarf ändern.
#!/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()
Andere Tipps
Ich denke, das ist, was Benutzerdefinierte Verwaltungsbefehle sind da.
Sounds wie Sie einige twod.wsgi in Ihrem Leben benötigen: http://packages.python.org /twod.wsgi/