J'ai travaillé sur une application Web utilisant Django, et je suis curieux de savoir s'il existe un moyen de planifier un travail à exécuter périodiquement.
Fondamentalement, je veux simplement parcourir la base de données et faire des calculs / mises à jour sur une base automatique et régulière, mais je n'arrive pas à trouver de documentation sur cela.
Est-ce que quelqu'un sait comment configurer cela?
Pour clarifier: je sais que je peux configurer un cron
travail pour ce faire, mais je suis curieux de savoir s'il existe une fonctionnalité dans Django qui fournit cette fonctionnalité. J'aimerais que les gens puissent déployer cette application eux-mêmes sans avoir à faire beaucoup de configuration (de préférence zéro).
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 sur le site, mais j'espère quelque chose d'un peu plus propre.
Réponses:
Une solution que j'ai employée est de faire ceci:
1) Créez une commande de gestion personnalisée , par exemple
2) Utilisez
cron
(sous Linux) ouat
(sous Windows) pour exécuter ma commande aux moments requis.Il s'agit d'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 des fichiers crontab. Cependant, la solution cron fonctionne très bien pour une application de petite à moyenne taille et où vous ne voulez pas beaucoup de dépendances externes.
ÉDITER:
Dans la version ultérieure de Windows, la
at
commande est déconseillée pour Windows 8, Server 2012 et supérieur. Vous pouvez utiliserschtasks.exe
pour le même usage.**** MISE À JOUR **** Ceci est le nouveau lien de django doc pour écrire la commande de gestion personnalisée
la source
python manage.py runcrons
qui exécute ensuite tous les crons que vous avez définis et enregistrés.Le céleri est une file d'attente de tâches distribuées, basée sur AMQP (RabbitMQ). Il gère également les tâches périodiques de façon cron (voir tâches périodiques ). Selon votre application, cela peut valoir le coup d'œil.
Le céleri est assez facile à configurer avec django ( docs ), et les tâches périodiques ignoreront en fait les tâches manquées en cas d'arrêt. Le céleri dispose également de mécanismes de relance intégrés, en cas d'échec d'une tâche.
la source
Nous avons ouvert ce que je pense être une application structurée. que la solution de Brian y fait également allusion. Nous aimerions tout / tous les commentaires!
https://github.com/tivix/django-cron
Il est livré avec une commande de gestion:
Cela fait l'affaire. Chaque cron est modélisé comme une 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 fonctionne pas en parallèle (au cas où les crons eux-mêmes prennent plus de temps à exécuter que leur fréquence!)
la source
at
ou a-t-il été spécialement conçu pour fonctionner aveccron
?Si vous utilisez un système d'exploitation POSIX standard, vous utilisez cron .
Si vous utilisez Windows, vous utilisez à .
Ecrivez une commande de gestion Django dans
Découvrez sur quelle plateforme ils se trouvent.
Exécutez la commande "AT" appropriée pour vos utilisateurs ou mettez à jour la crontab pour vos utilisateurs.
la source
Nouvelle application Django connectable intéressante: django-chronograph
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.
la source
Regardez Django Poor Man's Cron qui est une application Django qui utilise des spambots, des robots d'indexation des moteurs de recherche et autres pour exécuter des tâches planifiées à intervalles approximativement réguliers
Voir: http://code.google.com/p/django-poormanscron/
la source
J'avais exactement la même exigence il y a quelque temps, et j'ai fini par la résoudre en utilisant APScheduler ( Guide de l'utilisateur )
Il rend la planification des tâches super simple et la garde indépendante de l'exécution basée sur les requêtes de certains codes. Voici un exemple simple.
J'espère que cela aide quelqu'un!
la source
La suggestion de Brian Neal d'exécuter des commandes de gestion via cron fonctionne bien, mais si vous cherchez quelque chose d'un peu plus robuste (mais pas aussi élaboré que Celery), je chercherais dans une bibliothèque comme Kronos :
la source
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 gérerez les tâches rompues lors du prochain appel, alors Cron est suffisant.
Celery & AMQP vous permettra de gérer la tâche cassée, et elle sera exécutée à nouveau par un autre travailleur (les travailleurs de Celery écoutent la prochaine tâche à travailler), jusqu'à ce que l'
max_retries
attribut de la tâche soit atteint. Vous pouvez même invoquer des tâches en cas d'échec, comme la consignation de l'échec ou l'envoi d'un e-mail à l'administrateur une fois le messagemax_retries
atteint.Et vous pouvez distribuer des serveurs Celery et AMQP lorsque vous avez besoin de faire évoluer votre application.
la source
Personnellement , j'utilise Cron, mais les ordonnancement des travaux parties de django-extensions semble intéressant.
la source
Bien que ne faisant pas partie de Django, Airflow est un projet plus récent (à partir de 2016) qui est utile pour la gestion des tâches.
Airflow est un système d'automatisation et de planification de workflow qui peut être utilisé pour créer et gérer des pipelines de données. Une interface utilisateur Web offre au développeur une gamme d'options pour gérer et afficher ces pipelines.
Airflow est écrit en Python et est construit à l'aide de Flask.
Airflow a été créé par Maxime Beauchemin chez Airbnb et open source au printemps 2015. Il a rejoint le programme d'incubation de la Apache Software Foundation à l'hiver 2016. Voici la page du projet Git et quelques informations complémentaires .
la source
Placez ce qui suit en haut de votre fichier cron.py:
la source
Je viens de penser à cette solution assez simple:
Vous pouvez ajouter des paramètres mais simplement ajouter des paramètres à l'URL.
Dites-moi ce que vous en pensez.
[Mise à jour] J'utilise maintenant la commande runjob de django-extensions au lieu de curl.
Mon cron ressemble à ceci:
... et ainsi de suite pour tous les jours, tous les mois, etc '. Vous pouvez également le configurer pour exécuter un travail spécifique.
Je le trouve plus facile à gérer et plus propre. Ne nécessite pas de mapper une URL à une vue. Définissez simplement votre classe d'emploi et crontab et vous êtes prêt.
la source
après la partie de code, je peux écrire n'importe quoi comme mon views.py :)
depuis http://www.cotellese.net/2007/09/27/running-external-scripts-against-django-models/
la source
Vous devriez certainement vérifier django-q! Il ne nécessite aucune configuration supplémentaire et possède très probablement tout le nécessaire pour gérer les problèmes de production sur les projets commerciaux.
Il est activement développé et s'intègre très bien avec django, django ORM, mongo, redis. Voici ma configuration:
la source
Django APScheduler for Scheduler Jobs. Advanced Python Scheduler (APScheduler) est une bibliothèque Python qui vous permet de planifier votre code Python pour qu'il soit exécuté plus tard, soit une seule fois, soit périodiquement. Vous pouvez ajouter de nouveaux emplois ou supprimer les anciens à la volée à votre guise.
note: je suis l'auteur de cette bibliothèque
Installer APScheduler
Afficher la fonction de fichier à appeler
nom de fichier: scheduler_jobs.py
Configuration du planificateur
créer le fichier execute.py et ajouter les codes ci-dessous
Vos fonctions écrites Ici, les fonctions du planificateur sont écrites dans scheduler_jobs
Lier le fichier pour exécution
Maintenant, ajoutez la ligne ci-dessous au bas du fichier URL
la source
J'ai eu quelque chose de similaire avec votre problème aujourd'hui.
Je ne voulais pas le faire gérer par le serveur via cron (et la plupart des bibliothèques n'étaient que des aides cron à la fin).
J'ai donc créé un module de planification et je l'ai attaché à l' init .
Ce n'est pas la meilleure approche, mais cela m'aide à avoir tout le code en un seul endroit et avec son exécution liée à l'application principale.
la source
Oui, la méthode ci-dessus est tellement géniale. Et j'ai essayé certains d'entre eux. Enfin, j'ai trouvé une méthode comme celle-ci:
Tout comme récursif .
Ok, j'espère que cette méthode peut répondre à vos besoins. :)
la source
Une solution plus moderne (par rapport au céleri) est Django Q: https://django-q.readthedocs.io/en/latest/index.html
Il a une excellente documentation et est facile à gérer. La prise en charge de Windows fait défaut, car Windows ne prend pas en charge le forking de processus. Mais cela fonctionne très bien si vous créez votre environnement de développement à l'aide du sous-système Windows pour Linux.
la source
J'utilise le céleri pour créer mes tâches périodiques. Vous devez d'abord l'installer comme suit:
N'oubliez pas de vous enregistrer
django-celery
dans vos paramètres et vous pourriez alors faire quelque chose comme ceci:la source
Je ne suis pas sûr que cela sera utile à quiconque, car je devais fournir à d'autres utilisateurs du système pour planifier les travaux, sans leur donner accès au planificateur de tâches du serveur (Windows), j'ai créé cette application réutilisable.
Veuillez noter que les utilisateurs ont accès à un dossier partagé sur le serveur où ils peuvent créer le fichier de commande / tâche / .bat requis. Cette tâche peut ensuite être planifiée à l'aide de cette application.
Le nom de l'application est Django_Windows_Scheduler
Capture d'écran:
la source
Si vous voulez quelque chose de plus fiable que Celery , essayez TaskHawk qui est construit sur AWS SQS / SNS .
Voir: http://taskhawk.readthedocs.io
la source
Pour les projets dockers simples, je ne voyais pas vraiment de réponse existante.
J'ai donc écrit une solution très dépouillée sans avoir besoin de bibliothèques ou de déclencheurs externes, qui fonctionne seule. Aucun os-cron externe nécessaire, devrait fonctionner dans tous les environnements.
Cela fonctionne en ajoutant un middleware:
middleware.py
models/cron.py
:settings.py
:la source
Un moyen simple est d'écrire une commande shell personnalisée voir la documentation Django et de l'exécuter en utilisant un cronjob sur linux. Cependant, je recommanderais fortement d'utiliser un courtier de messages comme RabbitMQ couplé à du céleri. Vous pouvez peut-être jeter un œil à ce tutoriel
la source