587 votes

Mettre en place un travail programmé ?

J'ai travaillé sur une application web en utilisant Django, et je suis curieux de savoir s'il existe un moyen de programmer une tâche à exécuter périodiquement.

En gros, je veux juste parcourir la base de données et faire quelques calculs/mises à jour sur une base automatique et régulière, mais je ne trouve aucune documentation sur la façon de le faire.

Quelqu'un sait-il comment mettre cela en place ?

Pour clarifier : je sais que je peux mettre en place une cron pour le faire, mais je suis curieux de savoir s'il existe une fonctionnalité dans Django qui offre cette possibilité. J'aimerais que les gens puissent déployer cette application eux-mêmes sans avoir à faire beaucoup de configuration (de préférence aucune).

J'ai envisagé de déclencher ces actions "rétroactivement" en vérifiant simplement si un travail aurait dû être exécuté depuis la dernière fois qu'une demande a été envoyée au site, mais j'espère quelque chose d'un peu plus propre.

1 votes

Si vous êtes un site à haute performance et que vous utilisez déjà RabbitMQ, voici une astuce pour contourner cron : Utilisation d'AMQP pour une planification de type cron

0 votes

Si je comprends bien, vous devez planifier certaines tâches dans Django. La meilleure chose que j'ai trouvée ces derniers temps est celle-ci : celery.github.com/celery/index.html

0 votes

Qu'est-ce que vous en pensez ? github.com/reavis/django-cron

405voto

Brian Neal Points 13668

Une solution que j'ai employée consiste à faire ceci :

1) Créer un commande de gestion personnalisée par exemple

python manage.py my_cool_command

2) Utiliser cron (sous Linux) ou at (sous Windows) pour exécuter ma commande aux moments voulus.

Il s'agit d'une solution simple qui ne nécessite pas l'installation d'une pile AMQP lourde. Cependant, l'utilisation de quelque chose comme Celery, mentionné dans les autres réponses, présente des avantages intéressants. En particulier, avec Celery, il est agréable de ne pas avoir à répartir la logique de votre application dans des fichiers crontab. Cependant, la solution cron fonctionne très bien pour une application de taille petite à moyenne et où vous ne voulez pas beaucoup de dépendances externes.

EDITAR:

Dans les versions ultérieures de Windows, le at est obsolète pour Windows 8, Server 2012 et les versions ultérieures. Vous pouvez utiliser schtasks.exe pour le même usage.

**** UPDATE **** Ceci est le nouveau lien de la doc de django pour écrire la commande de gestion personnalisée

7 votes

Existe-t-il un moyen de faire cela sans services externes mais en utilisant un seul processus du framework django en cours d'exécution ?

4 votes

@Brian_Neal application django_cron.

2 votes

Veuillez m'aider à comprendre comment exécuter une commande de gestion dans un environnement virtuel en utilisant cron le dernier jour de chaque mois.

172voto

dln Points 651

Céleri est une file d'attente de tâches distribuées, construite sur AMQP (RabbitMQ). Elle gère également les tâches périodiques à la manière d'un cron (cf. tâches périodiques ). En fonction de votre application, cela peut valoir la peine de jeter un coup d'œil.

Celery est assez facile à mettre en place avec django ( docs ), et les tâches périodiques permettent de sauter les tâches manquées en cas d'arrêt. Celery dispose également de mécanismes de relance intégrés, en cas d'échec d'une tâche.

55voto

chachra Points 131

Nous avons mis en libre accès ce que je pense être une application structurée à laquelle la solution de Brian ci-dessus fait allusion. Nous serions ravis de recevoir vos commentaires !

https://github.com/tivix/django-cron

Il est livré avec une commande de gestion :

./manage.py runcrons

Cela fait le travail. Chaque cron est modélisé comme une classe (donc tout est OO) et chaque cron fonctionne à une fréquence différente et nous nous assurons que le même type de cron ne fonctionne pas en parallèle (au cas où les crons eux-mêmes prennent plus de temps à fonctionner que leur fréquence !)

7 votes

@chachra Désolé, je sais que c'est peut-être une question stupide, mais est-ce que cela fonctionnera sous Windows à travers at ou il a été conçu spécifiquement pour fonctionner avec cron ?

37voto

S.Lott Points 207588

Si vous utilisez un système d'exploitation POSIX standard, vous utilisez cron .

Si vous utilisez Windows, vous utilisez sur .

Écrire une commande de gestion Django pour

  1. Déterminez sur quelle plateforme ils se trouvent.

  2. Soit vous exécutez la commande "AT" appropriée pour vos utilisateurs, ou mettez à jour la crontab pour vos utilisateurs.

12 votes

J'aimerais qu'il soit intégré à mon application Django si possible.

0 votes

@TM : Que signifie "intégré dans mon application django" ? Veuillez clarifier votre question.

12 votes

J'aimerais que les gens puissent facilement déployer cette application sans avoir à configurer eux-mêmes des tâches cron.

23voto

Van Gale Points 21982

Nouvelle application Django pluggable intéressante : django-chronographe

Il vous suffit d'ajouter une entrée cron qui fait office de minuterie, et vous disposez d'une interface d'administration Django très agréable dans les scripts à exécuter.

2 votes

Django-chronograph n'est pas maintenu. Son fork fait beaucoup mieux : github.com/chrisspen/django-chroniker

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X