Question

Je souhaite que ma commande Django personnalisée soit exécutée toutes les minutes. Cependant, il semble que python /path/to/project/myapp/manage.py ma commande ne semble pas fonctionner alors que dans le répertoire python manage.py ma commande fonctionne parfaitement.

Comment puis-je atteindre cet objectif? J'utilise / etc / crontab avec:

****** root python /path/to/project/myapp/manage.py mycommand
Était-ce utile?

La solution

Je pense que le problème est que cron va exécuter vos scripts de manière "nue". environnement, votre DJANGO_SETTINGS_MODULE n’est donc probablement pas définie. Vous voudrez peut-être envelopper ceci dans un script shell qui définit d’abord DJANGO_SETTINGS_MODULE

Quelque chose comme ça:

#!/bin/bash

export DJANGO_SETTINGS_MODULE=myproject.settings 
./manage.py mycommand

Rendez-le exécutable (chmod + x) puis configurez cron pour exécuter le script à la place.

Modifier

Je voulais aussi dire que vous pouvez "modulariser". un peu ce concept et faites en sorte que votre script accepte les commandes de gestion comme arguments.

#!/bin/bash

export DJANGO_SETTINGS_MODULE=myproject.settings
./manage.py ${*}

Votre travail cron peut simplement transmettre "& my; commande". ou toute autre commande manage.py à exécuter à partir d'un travail cron.

Autres conseils

cd /path/to/project/myapp && python manage.py mycommand

En chaînant vos commandes de cette façon, python ne sera pas exécuté à moins que cd ne change correctement le répertoire.

Si vous voulez que votre vie Django soit beaucoup plus simple, utilisez django-command-extensions dans votre projet:

http://code.google.com/p/django-command-extensions /

Vous trouverez une commande nommée " runcript " donc vous ajoutez simplement la commande à votre ligne crontab:

****** root python /path/to/project/myapp/manage.py runscript mycommand

Et un tel script sera exécuté avec l'environnement de contexte Django.

C’est ce que j’ai fait récemment dans l’un de mes projets (je conserve des projets pour chaque projet que je travaille, je suppose donc que vous avez des projets)

 ***** /path/to/venvs/bin/python /path/to/app/manage.py command_name

Cela a parfaitement fonctionné pour moi.

L’extension du script d’exécution n’est pas bien documentée. Contrairement à la commande django, celle-ci peut aller n’importe où dans votre projet et nécessite un dossier de scripts. Le fichier .py nécessite une fonction run ().

  1. S'il s'agit d'un script autonome, procédez comme suit:

    from django.conf import settings
    from django.core.management import setup_environ
    setup_environ(settings)
    
    #your code here which uses django code, like django model
    
  2. Si c'est une commande django, c'est plus facile: https://coderwall.com/p/k5p6ag

    Dans (management / orders / exporter.py)

    from django.core.management.base import BaseCommand, CommandError
    
    class Command(BaseCommand):
        args = ''
        help = 'Export data to remote server'
    
        def handle(self, *args, **options):
            # do something here
    

Et ensuite, en ligne de commande:

$ python manage.py exporter

Maintenant, il est facile d'ajouter une nouvelle tâche périodique à un système Linux, à l'aide de crontab:

$ crontab -e

or $ sudo crontab -e if you need root privileges

Dans le fichier crontab, par exemple pour exécuter cette commande toutes les 15 minutes, à peu près comme ceci:

# m h  dom mon dow   command
*/15 * * * * python /var/www/myapp/manage.py exporter
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top