Ich habe mit Django an einer Web-App gearbeitet und bin gespannt, ob es eine Möglichkeit gibt, einen Job so zu planen, dass er regelmäßig ausgeführt wird.
Grundsätzlich möchte ich nur die Datenbank durchgehen und regelmäßig einige Berechnungen / Aktualisierungen vornehmen, aber ich kann anscheinend keine Dokumentation dazu finden.
Weiß jemand, wie man das einrichtet?
Zur Verdeutlichung: Ich weiß, dass ich einen cron
Job dafür einrichten kann , aber ich bin gespannt, ob es in Django eine Funktion gibt, die diese Funktionalität bietet. Ich möchte, dass die Benutzer diese App selbst bereitstellen können, ohne viel konfigurieren zu müssen (vorzugsweise null).
Ich habe überlegt, diese Aktionen "rückwirkend" auszulösen, indem ich einfach überprüfe, ob ein Job seit dem letzten Senden einer Anfrage an die Site ausgeführt werden sollte, aber ich hoffe auf etwas Saubereres.
Antworten:
Eine Lösung, die ich eingesetzt habe, ist folgende:
1) Erstellen Sie einen benutzerdefinierten Verwaltungsbefehl , z
2) Verwenden Sie
cron
(unter Linux) oderat
(unter Windows), um meinen Befehl zu den erforderlichen Zeiten auszuführen.Dies ist eine einfache Lösung, für die kein schwerer AMQP-Stack installiert werden muss. Es gibt jedoch nette Vorteile, etwas wie Sellerie zu verwenden, das in den anderen Antworten erwähnt wird. Insbesondere bei Sellerie ist es schön, dass Sie Ihre Anwendungslogik nicht in Crontab-Dateien verteilen müssen. Die Cron-Lösung eignet sich jedoch sehr gut für kleine bis mittelgroße Anwendungen, bei denen Sie nicht viele externe Abhängigkeiten benötigen.
BEARBEITEN:
In späteren
at
Windows- Versionen ist der Befehl für Windows 8, Server 2012 und höher veraltet. Sie könnenschtasks.exe
für die gleiche Verwendung verwenden.**** UPDATE **** Dies ist der neue Link von django doc zum Schreiben des benutzerdefinierten Verwaltungsbefehls
quelle
python manage.py runcrons
Fall müssen Sie einen Cron zum Ausführen festlegen, der dann alle von Ihnen definierten und registrierten Cron ausführt.Sellerie ist eine verteilte Aufgabenwarteschlange, die auf AMQP (RabbitMQ) basiert. Außerdem werden periodische Aufgaben cronartig behandelt (siehe periodische Aufgaben ). Abhängig von Ihrer App kann es einen Blick wert sein.
Sellerie ist mit Django ( Docs ) ziemlich einfach einzurichten , und regelmäßige Aufgaben überspringen im Falle einer Ausfallzeit tatsächlich verpasste Aufgaben. Sellerie verfügt auch über integrierte Wiederholungsmechanismen für den Fall, dass eine Aufgabe fehlschlägt.
quelle
Wir haben Open-Source-Anwendungen entwickelt, die meiner Meinung nach strukturiert sind. dass Brians Lösung oben auch anspielt. Wir würden uns über jedes Feedback freuen!
https://github.com/tivix/django-cron
Es kommt mit einem Verwaltungsbefehl:
Das macht den Job. Jeder Cron wird als Klasse modelliert (also ist alles OO) und jeder Cron läuft mit einer anderen Frequenz und wir stellen sicher, dass der gleiche Cron-Typ nicht parallel läuft (falls die Cron selbst länger brauchen als ihre Frequenz!)
quelle
at
oder wurde es speziell für die Arbeit entwickeltcron
?Wenn Sie ein Standard-POSIX-Betriebssystem verwenden, verwenden Sie cron .
Wenn Sie Windows verwenden, verwenden Sie at .
Schreiben Sie einen Django-Verwaltungsbefehl an
Finde heraus, auf welcher Plattform sie sich befinden.
Führen Sie entweder den entsprechenden "AT" -Befehl für Ihre Benutzer aus oder aktualisieren Sie die crontab für Ihre Benutzer.
quelle
Interessante neue steckbare Django App: Django-Chronograph
Sie müssen nur einen Cron-Eintrag hinzufügen, der als Timer fungiert, und Sie haben eine sehr schöne Django-Administrationsoberfläche in die auszuführenden Skripte.
quelle
Schauen Sie sich Django Poor Man's Cron an, eine Django-App, die Spambots, Suchmaschinen-Indizierungsroboter usw. verwendet, um geplante Aufgaben in ungefähr regelmäßigen Abständen auszuführen
Siehe: http://code.google.com/p/django-poormanscron/
quelle
Ich hatte vor einiger Zeit genau die gleiche Anforderung und löste sie schließlich mit APScheduler ( Benutzerhandbuch ).
Es macht das Planen von Jobs sehr einfach und hält es unabhängig von der anforderungsbasierten Ausführung von Code. Das Folgende ist ein einfaches Beispiel.
Hoffe das hilft jemandem!
quelle
Brian Neals Vorschlag, Verwaltungsbefehle über cron auszuführen, funktioniert gut, aber wenn Sie etwas Robusteres suchen (aber nicht so aufwändig wie Sellerie), würde ich in eine Bibliothek wie Kronos schauen :
quelle
RabbitMQ und Celery bieten mehr Funktionen und Funktionen zur Aufgabenabwicklung als Cron. Wenn ein Aufgabenfehler kein Problem darstellt und Sie glauben, dass Sie beim nächsten Aufruf fehlerhafte Aufgaben bearbeiten werden, ist Cron ausreichend.
Mit Celery & AMQP können Sie die fehlerhafte Aufgabe bearbeiten und sie wird erneut von einem anderen Mitarbeiter ausgeführt (Sellerie-Mitarbeiter warten auf die nächste Aufgabe, an der gearbeitet werden soll), bis das
max_retries
Attribut der Aufgabe erreicht ist. Sie können sogar Aufgaben bei einem Fehler aufrufen, z. B. das Protokollieren des Fehlers oder das Senden einer E-Mail an den Administratormax_retries
erreicht wurde.Und Sie können Sellerie- und AMQP-Server verteilen, wenn Sie Ihre Anwendung skalieren müssen.
quelle
Ich persönlich benutze cron, aber die Jobs Scheduling- Teile von Django-Erweiterungen sehen interessant aus.
quelle
Obwohl Airflow nicht Teil von Django ist, handelt es sich um ein neueres Projekt (Stand 2016), das für das Aufgabenmanagement nützlich ist.
Airflow ist ein Workflow-Automatisierungs- und Planungssystem, mit dem Datenpipelines erstellt und verwaltet werden können. Eine webbasierte Benutzeroberfläche bietet dem Entwickler eine Reihe von Optionen zum Verwalten und Anzeigen dieser Pipelines.
Airflow ist in Python geschrieben und wird mit Flask erstellt.
Airflow wurde von Maxime Beauchemin bei Airbnb erstellt und im Frühjahr 2015 als Open-Source-Version bereitgestellt. Im Winter 2016 wurde es dem Inkubationsprogramm der Apache Software Foundation beigetreten. Hier finden Sie die Git-Projektseite und einige zusätzliche Hintergrundinformationen .
quelle
Fügen Sie Folgendes oben in Ihre cron.py-Datei ein:
quelle
Ich habe gerade über diese ziemlich einfache Lösung nachgedacht:
Sie können Parameter hinzufügen, aber nur Parameter zur URL hinzufügen.
Sag mir, was ihr denkt.
[Update] Ich verwende jetzt den Befehl runjob von django-extensions anstelle von curl.
Mein Cron sieht ungefähr so aus:
... und so weiter für täglich, monatlich usw. '. Sie können es auch so einrichten, dass ein bestimmter Job ausgeführt wird.
Ich finde es überschaubarer und sauberer. Es ist nicht erforderlich, einer Ansicht eine URL zuzuordnen. Definieren Sie einfach Ihre Jobklasse und Crontab und schon sind Sie fertig.
quelle
Nach dem Teil des Codes kann ich alles schreiben, genau wie meine views.py :)
von http://www.cotellese.net/2007/09/27/running-external-scripts-against-django-models/
quelle
Sie sollten auf jeden Fall django-q ausprobieren! Es erfordert keine zusätzliche Konfiguration und verfügt möglicherweise über alles, was zur Behebung von Produktionsproblemen bei kommerziellen Projekten erforderlich ist.
Es ist aktiv entwickelt und lässt sich sehr gut in Django, Django ORM, Mongo und Redis integrieren. Hier ist meine Konfiguration:
quelle
Django APScheduler für Scheduler-Jobs. Advanced Python Scheduler (APScheduler) ist eine Python-Bibliothek, mit der Sie planen können, dass Ihr Python-Code später nur einmal oder regelmäßig ausgeführt wird. Sie können nach Belieben neue Jobs hinzufügen oder alte entfernen.
Hinweis: Ich bin der Autor dieser Bibliothek
Installieren Sie APScheduler
Zeigen Sie die aufzurufende Dateifunktion an
Dateiname: scheduler_jobs.py
Planer konfigurieren
Erstellen Sie die Datei execute.py und fügen Sie die folgenden Codes hinzu
Ihre geschriebenen Funktionen Hier werden die Scheduler-Funktionen in scheduler_jobs geschrieben
Verknüpfen Sie die Datei zur Ausführung
Fügen Sie nun die folgende Zeile am Ende der URL-Datei hinzu
quelle
Ich hatte heute etwas Ähnliches mit Ihrem Problem.
Ich wollte nicht, dass es vom Server verwaltet wird, obwohl Cron (und die meisten Bibliotheken waren am Ende nur Cron-Helfer).
Also habe ich ein Planungsmodul erstellt und es an den Init angehängt .
Es ist nicht der beste Ansatz, aber es hilft mir, den gesamten Code an einem einzigen Ort und mit seiner Ausführung in Bezug auf die Haupt-App zu haben.
quelle
Ja, die obige Methode ist so großartig. Und ich habe einige davon ausprobiert. Endlich habe ich eine Methode wie diese gefunden:
Genau wie rekursiv .
Ok, ich hoffe, diese Methode kann Ihre Anforderungen erfüllen. :) :)
quelle
Eine modernere Lösung (im Vergleich zu Sellerie) ist Django Q: https://django-q.readthedocs.io/en/latest/index.html
Es hat eine großartige Dokumentation und ist leicht zu verstehen. Die Windows-Unterstützung fehlt, da Windows das Prozessgabeln nicht unterstützt. Es funktioniert jedoch einwandfrei, wenn Sie Ihre Entwicklungsumgebung mit dem Windows für Linux-Subsystem erstellen.
quelle
Ich benutze Sellerie, um meine periodischen Aufgaben zu erstellen. Zuerst müssen Sie es wie folgt installieren:
Vergessen Sie nicht, sich
django-celery
in Ihren Einstellungen zu registrieren , und dann können Sie Folgendes tun:quelle
Ich bin mir nicht sicher, ob dies für irgendjemanden nützlich sein wird, da ich anderen Benutzern des Systems die Möglichkeit geben musste, die Jobs zu planen, ohne ihnen Zugriff auf den eigentlichen Server (Windows) Task Scheduler zu gewähren. Ich habe diese wiederverwendbare App erstellt.
Bitte beachten Sie, dass Benutzer Zugriff auf einen freigegebenen Ordner auf dem Server haben, in dem sie die erforderliche Befehls- / Task- / .bat-Datei erstellen können. Diese Aufgabe kann dann mit dieser App geplant werden.
App Name ist Django_Windows_Scheduler
Bildschirmfoto:
quelle
Wenn Sie etwas zuverlässigeres als Sellerie wünschen , versuchen Sie es mit TaskHawk , das auf AWS SQS / SNS basiert .
Siehe: http://taskhawk.readthedocs.io
quelle
Für einfache Docker-Projekte konnte ich keine passende Antwort sehen.
Also habe ich eine Barebone-Lösung geschrieben, ohne dass externe Bibliotheken oder Trigger erforderlich sind, die von selbst ausgeführt werden. Kein externes Betriebssystem benötigt, sollte in jeder Umgebung funktionieren.
Es funktioniert durch Hinzufügen einer Middleware:
middleware.py
models/cron.py
::settings.py
::quelle
Eine einfache Möglichkeit besteht darin, einen benutzerdefinierten Shell-Befehl zu schreiben (siehe Django-Dokumentation) und ihn mit einem Cronjob unter Linux auszuführen. Ich würde jedoch empfehlen, einen Nachrichtenbroker wie RabbitMQ in Verbindung mit Sellerie zu verwenden. Vielleicht können Sie sich dieses Tutorial ansehen
quelle