Pracuję nad aplikacją internetową przy użyciu Django i jestem ciekawy, czy istnieje sposób, aby zaplanować okresowe uruchamianie zadania.
Zasadniczo chcę po prostu przeglądać bazę danych i dokonywać automatycznych, regularnych obliczeń / aktualizacji, ale nie mogę znaleźć dokumentacji na ten temat.
Czy ktoś wie, jak to skonfigurować?
Wyjaśnienie: Wiem, że mogę skonfigurować cron
zadanie, aby to zrobić, ale jestem ciekawy, czy w Django jest jakaś funkcja zapewniająca tę funkcjonalność. Chciałbym, aby ludzie mogli sami wdrożyć tę aplikację bez konieczności przeprowadzania dużej konfiguracji (najlepiej zero).
Rozważałem uruchomienie tych działań „z mocą wsteczną”, po prostu sprawdzając, czy zadanie powinno zostać uruchomione od czasu ostatniego wysłania żądania do witryny, ale mam nadzieję na coś nieco czystszego.
Odpowiedzi:
Jednym z rozwiązań, które zastosowałem, jest:
1) Utwórz niestandardowe polecenie zarządzania , np
2) Użyj
cron
(w systemie Linux) lubat
(w systemie Windows), aby uruchomić polecenie w wymaganych godzinach.Jest to proste rozwiązanie, które nie wymaga instalowania dużego stosu AMQP. Istnieją jednak zalety korzystania z czegoś takiego jak seler, wspomniane w innych odpowiedziach. W szczególności, dzięki Selerowi fajnie jest nie rozkładać logiki aplikacji na pliki crontab. Jednak rozwiązanie cron działa całkiem nieźle dla małych i średnich aplikacji i tam, gdzie nie potrzebujesz wielu zewnętrznych zależności.
EDYTOWAĆ:
W późniejszej wersji systemu Windows to
at
polecenie jest nieaktualne w systemie Windows 8, Server 2012 i nowszych. Możesz użyćschtasks.exe
do tego samego zastosowania.**** UPDATE **** To nowy link do dokumentu django do pisania niestandardowego polecenia zarządzania
źródło
python manage.py runcrons
który następnie uruchamia wszystkie crony, które zdefiniowałeś i zarejestrowałeś.Seler jest rozproszoną kolejką zadań, zbudowaną na platformie AMQP (RabbitMQ). Obsługuje również zadania okresowe w sposób podobny do crona (patrz zadania okresowe ). W zależności od aplikacji może to być warte spojrzenia.
Seler jest dość łatwy do skonfigurowania za pomocą django ( docs ), a zadania okresowe faktycznie pomijają pominięte zadania w przypadku przestoju. Seler ma również wbudowane mechanizmy ponownej próby na wypadek niepowodzenia zadania.
źródło
Odkryliśmy, że moim zdaniem jest to aplikacja strukturalna. że powyższe rozwiązanie Briana również nawiązuje. Bardzo chcielibyśmy otrzymać wszelkie opinie!
https://github.com/tivix/django-cron
Zawiera jedno polecenie zarządzania:
To działa. Każdy cron jest modelowany jako klasa (więc jest to wszystko OO), a każdy cron działa na innej częstotliwości, a my upewniamy się, że ten sam typ cron nie działa równolegle (w przypadku, gdy sami cron potrzebują więcej czasu niż ich częstotliwość!)
źródło
at
czy było specjalnie zaprojektowane do pracycron
?Jeśli używasz standardowego systemu operacyjnego POSIX, używasz crona .
Jeśli używasz systemu Windows, używasz w .
Napisz polecenie zarządzania Django do
Dowiedz się, na jakiej platformie się znajdują.
Wykonaj odpowiednie polecenie „AT” dla swoich użytkowników lub zaktualizuj plik crontab dla swoich użytkowników.
źródło
Interesująca nowa aplikacja Django z wtyczką: django-chronograph
Musisz tylko dodać jeden wpis crona, który działa jak licznik czasu, i masz bardzo ładny interfejs administratora Django do skryptów do uruchomienia.
źródło
Spójrz na Django Poor Man's Cron, która jest aplikacją Django, która korzysta ze spambotów, robotów indeksujących wyszukiwarki i podobnych do uruchamiania zaplanowanych zadań w przybliżeniu w regularnych odstępach czasu
Zobacz: http://code.google.com/p/django-poormanscron/
źródło
Jakiś czas temu miałem dokładnie taki sam wymóg i ostatecznie rozwiązałem go za pomocą APScheduler ( instrukcja obsługi )
To sprawia, że zadania planowania są bardzo proste i zachowują niezależność od wykonywania niektórych kodów na podstawie żądań. Poniżej znajduje się prosty przykład.
Mam nadzieję, że to komuś pomoże!
źródło
Sugestia Briana Neala, aby uruchamiać polecenia zarządzania za pomocą crona, działa dobrze, ale jeśli szukasz czegoś bardziej solidnego (ale nie tak skomplikowanego jak Selery), zajrzałbym do biblioteki takiej jak Kronos :
źródło
RabbitMQ i Seler mają więcej funkcji i możliwości obsługi zadań niż Cron. Jeśli niepowodzenie zadania nie stanowi problemu i uważasz, że poradzisz sobie z uszkodzonymi zadaniami w następnym wywołaniu, wtedy Cron jest wystarczający.
Celery i AMQP pozwolą ci poradzić sobie z przerwanym zadaniem i będzie ono wykonywane ponownie przez innego pracownika (pracownicy Selera nasłuchują następnego zadania do pracy), dopóki nie
max_retries
zostanie osiągnięty atrybut zadania . Możesz nawet wywoływać zadania w przypadku awarii, takie jak rejestrowanie awarii lub wysyłanie wiadomości e-mail do administratora pomax_retries
osiągnięciu.I możesz dystrybuować serwery Selery i AMQP, gdy potrzebujesz skalować swoją aplikację.
źródło
Ja osobiście korzystam z crona, ale planowanie zadań części rozszerzeń django wygląda interesująco.
źródło
Chociaż Airflow nie jest częścią Django, jest nowszym projektem (od 2016 r.), Który jest przydatny do zarządzania zadaniami.
Airflow to system automatyzacji i planowania przepływu pracy, którego można używać do tworzenia i zarządzania potokami danych. Internetowy interfejs użytkownika zapewnia programistom szereg opcji zarządzania i przeglądania tych potoków.
Przepływ powietrza jest napisany w języku Python i zbudowany przy użyciu Flask.
Airflow został stworzony przez Maxime Beauchemin z Airbnb i otwarty na wiosnę 2015 roku. Dołączył do programu inkubacyjnego Apache Software Foundation zimą 2016 roku. Oto strona projektu Git i dodatkowe informacje dodatkowe .
źródło
Umieść na górze pliku cron.py:
źródło
Właśnie pomyślałem o tym dość prostym rozwiązaniu:
Możesz dodać parametry, ale tylko dodać parametry do adresu URL.
Powiedzcie mi co myślicie.
[Aktualizacja] Teraz używam polecenia runjob z rozszerzeń django zamiast curl.
Mój cron wygląda mniej więcej tak:
... i tak dalej codziennie, co miesiąc itp. ” Możesz również skonfigurować go do uruchamiania określonego zadania.
Uważam, że jest to łatwiejsze do zarządzania i czystsze. Nie wymaga mapowania adresu URL do widoku. Po prostu określ swoją klasę pracy i tabelę zadań i gotowe.
źródło
po części kodu mogę pisać wszystko tak jak moje views.py :)
from http://www.cotellese.net/2007/09/27/running-external-scripts-against-django-models/
źródło
Zdecydowanie powinieneś sprawdzić django-q! Nie wymaga dodatkowej konfiguracji i prawdopodobnie ma wszystko, co potrzebne do obsługi wszelkich problemów produkcyjnych w projektach komercyjnych.
Jest aktywnie rozwijany i bardzo dobrze integruje się z django, django ORM, mongo, redis. Oto moja konfiguracja:
źródło
Django APScheduler for Scheduler Jobs. Advanced Python Scheduler (APScheduler) to biblioteka języka Python, która pozwala zaplanować wykonanie kodu w języku Python później, tylko raz lub okresowo. Możesz dodawać nowe oferty pracy lub usuwać stare w dowolnym momencie.
Uwaga: Jestem autorem tej biblioteki
Zainstaluj APScheduler
Wyświetl funkcję pliku, aby zadzwonić
nazwa pliku: scheduler_jobs.py
Konfigurowanie harmonogramu
stwórz plik execute.py i dodaj poniższe kody
Twoje pisemne funkcje Tutaj funkcje harmonogramu są zapisane w harmonogramie_zadania
Połącz plik do wykonania
Teraz dodaj poniższy wiersz na dole pliku Url
źródło
Miałem dzisiaj coś podobnego z twoim problemem.
Nie chciałem, żeby to obsłużył serwer trhough cron (a większość bibliotek była w końcu tylko pomocnikami crona).
Więc stworzyłem moduł planowania i podłączyłem go do init .
To nie jest najlepsze podejście, ale pomaga mi mieć cały kod w jednym miejscu i jego wykonanie związane z główną aplikacją.
źródło
Tak, powyższa metoda jest świetna. I próbowałem niektóre z nich. W końcu znalazłem taką metodę:
Tak jak rekurencyjny .
Ok, mam nadzieję, że ta metoda spełni twoje wymagania. :)
źródło
Bardziej nowoczesnym rozwiązaniem (w porównaniu do Celery) jest Django Q: https://django-q.readthedocs.io/en/latest/index.html
Ma świetną dokumentację i jest łatwy do odczytania. Brakuje obsługi systemu Windows, ponieważ system Windows nie obsługuje rozwidlania procesów. Ale działa dobrze, jeśli tworzysz środowisko programistyczne za pomocą podsystemu Windows for Linux.
źródło
Używam selera do tworzenia okresowych zadań. Najpierw musisz zainstalować go w następujący sposób:
Nie zapomnij zarejestrować się
django-celery
w ustawieniach, a wtedy możesz zrobić coś takiego:źródło
Nie jestem pewien, czy będzie to przydatne dla każdego, ponieważ musiałem zapewnić innym użytkownikom systemu planowanie zadań, nie dając im dostępu do faktycznego harmonogramu zadań serwera (systemu Windows), stworzyłem tę aplikację wielokrotnego użytku.
Uwaga: użytkownicy mają dostęp do jednego folderu współdzielonego na serwerze, na którym mogą utworzyć wymagany plik polecenia / zadania / .bat. To zadanie można następnie zaplanować za pomocą tej aplikacji.
Nazwa aplikacji to Django_Windows_Scheduler
Zrzut ekranu:
źródło
Jeśli chcesz czegoś bardziej niezawodnego niż seler , wypróbuj TaskHawk, który jest oparty na AWS SQS / SNS .
Patrz: http://taskhawk.readthedocs.io
źródło
W przypadku prostych projektów zadokowanych nie widziałem żadnej istniejącej odpowiedzi.
Napisałem więc bardzo proste rozwiązanie bez potrzeby korzystania z zewnętrznych bibliotek lub wyzwalaczy, które działają same. Nie wymaga zewnętrznego os-crona, powinien działać w każdym środowisku.
Działa poprzez dodanie oprogramowania pośredniego:
middleware.py
models/cron.py
:settings.py
:źródło
Prostym sposobem jest napisanie niestandardowego polecenia powłoki, patrz Dokumentacja Django i wykonanie go za pomocą cronjob na Linuksie. Jednak zdecydowanie polecam korzystanie z brokera wiadomości, takiego jak RabbitMQ w połączeniu z selerem. Może możesz rzucić okiem na ten samouczek
źródło