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?

Était-ce utile?

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/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top