Question Django - Configurer 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 planifier un travail pour qu'il s'exécute périodiquement.

Fondamentalement, je veux juste parcourir la base de données et faire des calculs / mises à jour de façon automatique et régulière, mais je n'arrive pas à trouver de documentation pour ce faire.

Est-ce que quelqu'un sait comment mettre en place cela?

Pour clarifier: je sais que je peux mettre en place un cron travail pour le faire, mais je suis curieux de savoir s'il existe certaines fonctionnalités dans Django qui fournit cette fonctionnalité. J'aimerais que les gens puissent déployer cette application sans avoir à faire beaucoup de config (de préférence zéro).

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


418
2018-02-21 19:39


origine


Réponses:


Une solution que j'ai employée est de faire ceci:

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

python manage.py my_cool_command

2) Utilisation cron (sous Linux) ou at (sous Windows) pour exécuter ma commande aux heures requises.

C'est une solution simple qui ne nécessite pas l'installation d'une pile AMQP lourde. Cependant, il y a de bons avantages à utiliser quelque chose comme le céleri, mentionné dans les autres réponses. En particulier, avec Celery, il est agréable de ne pas avoir à étendre la logique de votre application dans les fichiers crontab. Cependant, la solution cron fonctionne très bien pour une application de petite ou moyenne taille et ne nécessite pas beaucoup de dépendances externes.

MODIFIER:

Dans la version ultérieure de Windows, le at La commande est obsolète pour Windows 8, Server 2012 et supérieur. Vous pouvez utiliser schtasks.exe pour la même utilisation.


304
2018-02-21 20:06



Céleri est une file d'attente de tâches distribuée, construite sur AMQP (RabbitMQ). Il gère également des tâches périodiques de manière cron (voir tâches périodiques). En fonction de votre application, cela pourrait valoir la peine d'un coup d'oeil.

Céleri est assez facile à mettre en place avec django (docs), et les tâches périodiques évitent les tâches manquées en cas d’interruption. Le céleri a également des mécanismes de nouvelle tentative intégrés en cas d'échec d'une tâche.


123
2018-06-29 11:56



Nous avons ouvert ce que je pense être une application structurée. La solution de Brian ci-dessus fait également allusion. J'adorerais tout / tous les 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é en tant que classe (donc tout est OO) et chaque cron s'exécute à une fréquence différente et nous nous assurons que le même type de cron ne s'exécute pas en parallèle (si les crons eux-mêmes prennent plus de temps que leur fréquence!)

Merci!


43
2018-01-30 21:47



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

Si vous utilisez Windows, vous utilisez à.

Ecrivez une commande de gestion Django à

  1. Déterminez quelle plate-forme ils sont.

  2. Exécutez la commande "AT" appropriée pour vos utilisateurs, ou mettre à jour le crontab pour vos utilisateurs.


32
2018-02-21 20:04



Nouvelle application Django intéressante: django-chronographe

Vous n'avez qu'à ajouter une entrée cron qui agit comme un minuteur, et vous avez une très belle interface d'administration Django dans les scripts à exécuter.


22
2018-03-07 08:32



Regardez Cron de Django Poor Man, qui est une application Django qui utilise des robots, des robots d’indexation des moteurs de recherche pour exécuter des tâches planifiées à intervalles réguliers.

Voir: http://code.google.com/p/django-poormanscron/


14
2018-02-21 20:29



La suggestion de Brian Neal de lancer des commandes de gestion via cron fonctionne bien, mais si vous cherchez quelque chose de plus robuste (mais pas aussi élaboré que Celery), je me pencherai sur une bibliothèque comme Kronos:

# app/cron.py

import kronos

@kronos.register('0 * * * *')
def task():
    pass

9
2017-12-20 12:30



RabbitMQ et Celery ont plus de fonctionnalités et de capacités de gestion des tâches que Cron. Si l'échec de la tâche n'est pas un problème et que vous pensez que vous allez gérer les tâches cassées lors de l'appel suivant, alors Cron est suffisant.

Céleri & AMQP vous permettra de gérer la tâche interrompue, et elle sera à nouveau exécutée par un autre travailleur (les travailleurs de Celery écoutent la tâche suivante à exécuter), jusqu'à ce que la tâche soit terminée. max_retries attribut est atteint. Vous pouvez même invoquer des tâches en cas d'échec, comme la consignation de l'échec ou l'envoi d'un courrier électronique à l'administrateur une fois max_retries a été atteint.

Et vous pouvez distribuer des serveurs Celery et AMQP lorsque vous avez besoin de mettre votre application à l'échelle.


9
2018-04-03 14:54