Django équivalent à Paster pour les processus de back-end
Question
Je l'utilise dans mon travail Pylônes, mais je suis nouveau à django. Je fais une demande de filtrage rss, et donc je voudrais avoir deux processus d'arrière-plan qui fonctionnent sur un calendrier: un aux flux d'analyse pour chaque utilisateur, et un autre pour déterminer la pertinence des messages individuels par rapport aux préférences passées des utilisateurs. Dans Pylônes, je venais de commandes d'écriture paster mettre à jour le db avec ces données. Y at-il un équivalent en django? EG est-il un moyen d'exécuter l'équivalent de python manage.py shell
en mode non-interactif?
La solution
Oui, c'est en fait que je lance mes scripts de sauvegarde Cron. Vous avez juste besoin de charger votre virtualenv si vous utilisez des environnements virtuels et paramètres de votre projet.
J'espère que vous pouvez suivre, mais après la # manage.py shell
ligne vous pouvez écrire votre code comme si vous étiez dans manage.py shell
Vous pouvez importer vos virtualenv comme ceci:
import site
site.addsitedir(VIRTUALENV_PATH + '/lib/python2.6/site-packages')
Vous pouvez ensuite ajouter le projet django sur le chemin
import sys
sys.path.append(DJANGO_ROOT)
sys.path.append(PROJECT_PATH)
Ensuite, vous chargez les paramètres de django et chdir au projet django
import os
from django.core.management import setup_environ
from myproject import settings
setup_environ(settings)
os.chdir(PROJECT_PATH)
Après ce stade, votre environnement sera comme si vous avez commencé avec manage.py shell
Vous pouvez alors tout simplement courir comme si vous étiez du shell interactif.
from application.models import MyModel
for element in MyModel:
element.delete()
Voici mon fichier de sauvegarde dans son intégralité. J'ai Abstraite l'out processus en fonctions. Ce serait nommé daily_backup
et être mis dans le dossier cron.daily
à exécuter tous les jours. Vous pouvez voir comment mettre en place l'environnement et modifier la fonctionnalité au besoin.
#!/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()
Autres conseils
Je pense que ce que Commandes de gestion personnalisés sont là pour.
On dirait que vous avez besoin twod.wsgi dans votre vie: http://packages.python.org /twod.wsgi/