Django commande personnalisée et cron
-
05-07-2019 - |
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
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 ().
-
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
-
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