Django - nustatykite suplanuotą užduotį?

Dirbu su interneto programa, naudojant „Django“, ir aš smalsu, ar yra būdas planuoti užduotį periodiškai.

Iš esmės, aš tiesiog noriu paleisti duomenų bazę ir reguliariai atlikti kai kuriuos skaičiavimus / atnaujinimus, bet apie tai negaliu rasti jokių dokumentų.

Kiekvienas žino, kaip tai nustatyti?

Norėdami paaiškinti: aš žinau, kad galiu konfigūruoti cron šiai užduočiai, bet aš smalsu, ar yra kokia nors funkcija Django, kuri suteikia šią funkciją. Norėčiau, kad žmonės galėtų savarankiškai įdiegti šią programą be daugybės konfigūracijų (pageidautina nulis).

Pažvelgiau į šių veiksmų pradžią, tiesiog tikrinant, ar užduotis turėtų būti atlikta nuo paskutinio prašymo pateikti svetainę prašymo, bet tikiuosi, kad kažkas švaresnio.

442
TM. Vasario 21 d 2009-02-21 22:39 '09 at 10:39 2009-02-21 22:39
@ 22 atsakymai

Vienas iš mano panaudotų sprendimų yra toks:

1) Sukurkite, pavyzdžiui, pasirinktinį valdymo komandą .

 python manage.py my_cool_command 

2) Naudokite „ cron („Linux“) arba at Windows“ sistemoje, kad paleistumėte komandą reikiamu laiku.

Tai paprastas sprendimas, kuriam nereikia įdiegti sunkiųjų AMQP stekų. Tačiau yra gerų privalumų naudojant kažką panašaus saliero, paminėto kituose atsakymuose. Visų pirma, su salierais malonu ne platinti taikomųjų programų logikos į crontab failus. Tačiau „cron“ sprendimas veikia gana gerai mažoms ir vidutinėms programoms, o kai nenorite daug išorinių priklausomybių.

EDIT:

Vėlesnėje Windows versijoje „ at komanda yra pasenusi „Windows 8“, „Server 2012“ ir vėlesnei versijai. schtasks.exe patiems tikslams galite naudoti schtasks.exe .

321
21 февр. atsakymą pateikė Brian Neal 21 vasaris. 2009-02-21 23:06 '09 at 11:06 PM 2009-02-21 23:06

Salierai yra paskirstyta užduočių eilė, sukurta AMQP (RabbitMQ). Jis taip pat apdoroja periodines užduotis, naudodamas „cron“ (žr. Periodines užduotis ). Priklausomai nuo jūsų paraiškos, tai gali kainuoti gander.

Salierai yra gana lengva nustatyti su django ( docs ), ir periodinės užduotys iš tikrųjų praleidžia praleistus uždavinius, jei neveikia, salierai taip pat turi įmontuotų pakartojimo mechanizmų, jei užduotis nepavyksta.

125
29 июня '09 в 14:56 2009-06-29 14:56 atsakymas pateikiamas dln birželio 29 d., 09:56 , 2009-06-29 14:56

Turime atvirą kodą, kuris, mano nuomone, yra struktūrizuota programa. Briano sprendimas yra virš patarimo. Norėčiau mylėti bet kokį / grįžtamąjį atsiliepimą!

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

Su viena vadovų komanda:

 ./manage.py runcrons 

Tai atlieka darbą. Kiekvienas cronas yra modeliuojamas kaip klasė (taigi, visa OO), ir kiekvienas cronas veikia skirtingu dažnumu, ir matome, kad tas pats crono tipas neveikia lygiagrečiai (jei patys karūnai užtrunka ilgiau nei jų dažnis)!

Ačiū!

44
31 янв. atsakymas chachra sausio 31 d 2012-01-31 00:47 '12 prie 0:47 2012-01-31 00:47

Jei naudojate standartinę POSIX OS, naudojate cron .

Jei naudojate >

Įrašykite Django valdymo komandą

  • Nustatykite, kuri platforma yra.

  • Atlikite atitinkamą „AT“ komandą savo naudotojams arba atnaujinkite „crontab“ naudotojams.

34
21 февр. atsakymą pateikė S.Lott, vasario 21 d 2009-02-21 23:04 '09 at 11:04 PM 2009-02-21 23:04

Įdomios naujos Django įskiepio programos: django-chronograph

Jums reikia pridėti tik vieną cron įrašą, kuris veikia kaip laikmatis, ir turite labai gražią „Django“ administratoriaus sąsają scenarijų veikimui.

23
07 марта '09 в 11:32 2009-03-07 11:32 atsakymą pateikė „ Van Gale “ kovo 07 d., 09:32 2009-03-07 11:32

Pažvelkite į „Django Poor Man Cron“, kuri yra „Django“ programa, kuri naudoja spam'o botus, robotus, kad indeksuotų paieškos sistemas, ir tą patį reguliariai atliekant suplanuotas užduotis.

Žr. Http://code.google.com/p/django-poormanscron/

14
21 февр. atsakymas, kurį pateikė naudotojo171767 vasario 21 d. 2009-02-21 23:29 '09, 23:29 PM 2009-02-21 23:29

„RabbitMQ“ ir „Celery“ turi daugiau funkcijų ir apdorojimo galimybių nei „Cron“. Jei užduoties gedimas nėra problema, ir manote, kad kitą skambutį atliksite sugedusias užduotis, tada Cron pakaks.

Salierai ir AMQP leis jums susidoroti su trikdoma užduotimi ir ją dar kartą atliks kitas darbuotojas (salierų darbuotojai klausysis kitos užduoties darbui), kol bus max_retries užduoties atributas. Jūs netgi galite suaktyvinti užduotis nesėkmingai, pvz., Užregistruoti klaidą arba išsiųsti administratoriui laišką, kai max_retries .

Ir jūs galite platinti salierų serverius ir AMQP, kai jums reikia mastelio jūsų paraišką.

9
03 апр. Atsakymą pateikė Ravi Kumar 03 Bal. 2012-04-03 17:54 '12, 17:54 val. 2012-04-03 17:54

„Brian Neal“ pasiūlymas dėl valdymo komandų vykdymo cron'u veikia gerai, bet jei ieškote kažko daugiau patikimesnio (bet ne taip sudėtingo kaip salierai), norėčiau pažvelgti į tokią biblioteką kaip Kronos :

 # app/cron.py import kronos @kronos.register('0 * * * *') def task(): pass 
9
20 дек. Johannes Gorset atsakymas 20 d. 2011-12-20 15:30 '11, 15:30, 2011-12-20 15:30

Aš asmeniškai naudoju cron, bet django plėtinių planavimo darbai dalims atrodo įdomūs.

8
22 февр. Atsakymą pateikė Van Gale vasario 22 d. 2009-02-22 06:18 '09, 6:18 val. 2009-02-22 06:18

Cron.py failo pradžioje įdėkite:

 #!/usr/bin/python import os, sys sys.path.append('/path/to/') # the parent directory of the project sys.path.append('/path/to/project') # these lines only needed if not on path os.environ['DJANGO_SETTINGS_MODULE'] = 'myproj.settings' # imports and code below 
6
08 янв. Atsakyti Matt McCormick 08 Sau 2010-01-08 02:26 '10, 2:26 val. 2010-01-08 02:26

Netrukus turėjau tą patį reikalavimą, ir aš nusprendžiau ją išspręsti naudojant APScheduler ( vartotojo vadovą )

Tai supaprastina tvarkaraščių sudarymą ir saugo jį nuo vykdymo pagal užklausą. Žemiau yra paprastas pavyzdys, kurį naudoju savo kode.

 from apscheduler.schedulers.background import BackgroundScheduler scheduler = BackgroundScheduler() job = None def tick(): print('One tick!')\ def start_job(): global job job = scheduler.add_job(tick, 'interval', seconds=3600) try: scheduler.start() except: pass 

Tikiuosi, kad tai padės kam nors!

6
22 июня '17 в 17:04 2017-06-22 17:04 atsakymą PhoenixDev pateikia birželio 17 d. 17 d. 17:04 2017-06-06 17:04

Nors oro srautas nėra „Django“ dalis, jis yra naujesnis projektas (pradedant nuo 2016 m.), Kuris yra naudingas užduočių valdymui.

Oro srautas yra automatizavimo ir darbo eigos planavimo sistema, kuria galima naudotis kuriant ir valdant duomenų vamzdynus. Žiniatinklio vartotojo sąsaja suteikia kūrėjui galimybę valdyti ir peržiūrėti šiuos vamzdynus.

Oro srautas yra parašytas „Python“ ir pastatytas naudojant kolbą.

Oro srautą sukūrė „Maxime Beauchemin“ „Airbnb“ ir atidarė 2015 m. Pavasarį. Jis prisijungė prie „Apache Software Foundations“ inkubacijos programos 2016 m. Žiemą. Čia yra „ Git“ projekto puslapis ir papildoma informacija .

6
19 июля '16 в 23:49 2016-07-19 23:49 atsakymą davė Aleksandras liepos 16 d., 16 val. 11:49 2016-07-19 23:49

Aš tiesiog galvojau apie šį gana paprastą sprendimą:

  1. Nustatykite do_work (req, param) peržiūros funkciją , kaip ir bet kurį kitą vaizdą, rodomus URL, HttpResponse ir tt
  2. Nustatykite cron užduotį naudodami laiko nustatymus (naudodami AT arba suplanuotas užduotis sistemoje „Windows“), kur kreivė yra http: // localhost / your / mapped / url? Param = reikšmė .

Galite pridėti parametrus ir tiesiog pridėti parametrus prie URL.

Pasakyk man, ką jūs galvojate.

[Refresh] Dabar naudoju runjob komandą iš django-extensions vietoj curl.

Mano cron atrodo taip:

 @hourly python /path/to/project/manage.py runjobs hourly 

... ir tt už dieną, mėnesį ir tt Taip pat galite pritaikyti ją konkrečiai užduočiai.

Manau, kad tai yra lengviau valdoma ir švaresnė. Nereikalauja, kad būtų pateiktas URL žemėlapis. Tiesiog nustatykite savo darbo klasę ir „crontab“, ir jūs esate įsteigtas.

6
30 окт. Atsakymą pateikė Michael, spalio 30 d 2011-10-30 16:19 '11, 16:19, 2011-10-30 16:19

po kodo, galiu parašyti ką nors, kaip mano view.py :)

 ####################################### import os,sys sys.path.append('/home/administrator/development/store') os.environ['DJANGO_SETTINGS_MODULE']='store.settings' from django.core.management impor setup_environ from store import settings setup_environ(settings) ####################################### 

http://www.cotellese.net/2007/09/27/running-external-scripts-against-django-models/

4
17 мая '11 в 6:09 2011-05-17 06:09 atsakymas pateikiamas Xiaohei gegužės 17 d. 11 val. 06:09 2011-05-17 06:09

Šiandien turėjau kažką panašaus į jūsų problemą.

Aš nenorėjau, kad ją tvarkytų trhough cron serveris (ir dauguma jų buvo tik crono padėjėjai).

Taigi, aš sukūriau planavimo modulį ir prijungiau jį prie init .

Tai nėra geriausias metodas, tačiau tai padeda man turėti visą kodą vienoje vietoje ir su jos vykdymu, susijusiu su pagrindine programa.

2
02 сент. Atsakymas, kurį pateikė Fabricio Buzeto 02 Sep 2011-09-02 21:41 '11 prie 21:41 2011-09-02 21:41

Taip, aukščiau pateiktas metodas yra toks didelis. Aš bandžiau kai kuriuos iš jų. Galiausiai radau šį metodą:

  from threading import Timer def sync(): do something... sync_timer = Timer(self.interval, sync, ()) sync_timer.start() 

Taip pat žinomas kaip rekursinis .

Na, tikiuosi, kad šis metodas gali atitikti jūsų reikalavimus. :)

2
26 марта '14 в 4:04 2014-03-26 04:04 Atsakymą pateikė Ni Xiaoni , kovo 26 d. 14, 04:04 2014-03-26 04:04

Turėtumėte tikrai patikrinti django-q! Tai nereikalauja papildomos konfigūracijos ir, ko gero, reikalinga sprendžiant bet kokias komercinių projektų gamybos problemas.

Ji aktyviai vystosi ir gerai integruojasi su django, django ORM, mongo, redis. Čia yra mano konfigūracija:

 # django-q # ------------------------------------------------------------------------- # See: http://django-q.readthedocs.io/en/latest/configure.html Q_CLUSTER = { # Match recommended settings from docs. 'name': 'DjangoORM', 'workers': 4, 'queue_limit': 50, 'bulk': 10, 'orm': 'default', # Custom Settings # --------------- # Limit the amount of successful tasks saved to Django. 'save_limit': 10000, # See https://github.com/Koed00/django-q/issues/110. 'catch_up': False, # Number of seconds a worker can spend on a task before it terminated. 'timeout': 60 * 5, # Number of seconds a broker will wait for a cluster to finish a task before presenting it again. This needs to be # longer than 'timeout', otherwise the same task will be processed multiple times. 'retry': 60 * 6, # Whether to force all async() calls to be run with sync=True (making them synchronous). 'sync': False, # Redirect worker exceptions directly to Sentry error reporter. 'error_reporter': { 'sentry': RAVEN_CONFIG, }, } 
2
04 авг. atsakymas pateikiamas saran3h 04 rug . 2018-08-04 08:50 '18, 08:50 2018-08-04 08:50

Modernesnis sprendimas (palyginti su salierais) yra „Django Q“: https://django-q.readthedocs.io/en/latest/index.html

Jis turi puikią dokumentaciją ir lengvai supranta. Nėra „Windows“ palaikymo, nes „Windows“ nepalaiko priverstinio proceso. Bet tai veikia gerai, jei sukuriate „Windows“ posistemį „Linux“ vystymo aplinką.

1
11 нояб. atsakymas pateikiamas devdrc 11 nov. 2017-11-11 19:38 '17, 7:38 pm 2017-11-11 19:38

Naudoju salierus, kad galėčiau sukurti savo periodines užduotis. Pirmiausia turite ją įdiegti taip:

 pip install django-celery 

Nepamirškite užregistruoti „ django-celery “ savo pageidavimuose, tada galite tai padaryti:

 from celery import task from celery.decorators import periodic_task from celery.task.schedules import crontab from celery.utils.log import get_task_logger @periodic_task(run_every=crontab(minute="0", hour="23")) def do_every_midnight(): #your code 
1
01 сент. David Felipe Camargo Polo atsakymas rugsėjo 01 d 2015-09-01 00:52 '15 prie 0:52 2015-09-01 00:52

Nesu tikras, kad jis bus naudingas visiems, nes turėjau pateikti kitiems sistemos naudotojams užduočių tvarkaraštį, nesuteikdamas jiems galimybės naudotis tikruoju tvarkaraščiu (Windows), sukūriau šią pakartotinai naudojamą programą.

Atkreipkite dėmesį, kad vartotojai turi prieigą prie vieno bendro serverio aplanko, kuriame jie gali sukurti reikalingą komandų / užduočių / .bato failą. Tada šią užduotį galima suplanuoti naudojant šią programą.

Programos pavadinimas Django_Windows_Scheduler

ScreenShot: 2019

11 янв. atsakymas pateikiamas tik 10 min. sausio 11 d 2017-01-11 22:34 '17, 10:34 pm 2017-01-11 22:34

Paprastiems dokumentuotiems projektams negalėjau rasti tinkamo atsakymo.

Todėl aš parašiau labai kuklią sprendimą be išorinių bibliotekų ar trigerių, kurie savaime veikia. Išorės os-cron nereikia, ji turėtų veikti bet kurioje aplinkoje.

Tai veikia pridedant middleware.py middleware.py programinę middleware.py : middleware.py

 import threading def should_run(name, seconds_interval): from application.models import CronJob from django.utils.timezone import now try: c = CronJob.objects.get(name=name) except CronJob.DoesNotExist: CronJob(name=name, last_ran=now()).save() return True if (now() - c.last_ran).total_seconds() >= seconds_interval: c.last_ran = now() c.save() return True return False class CronTask: def __init__(self, name, seconds_interval, function): self.name = name self.seconds_interval = seconds_interval self.function = function def cron_worker(*_): if not should_run("main", 60): return # customize this part: from application.models import Event tasks = [ CronTask("events", 60 * 30, Event.clean_stale_objects), # ... ] for task in tasks: if should_run(task.name, task.seconds_interval): task.function() def cron_middleware(get_response): def middleware(request): response = get_response(request) threading.Thread(target=cron_worker).start() return response return middleware 

models/cron.py :

 from django.db import models class CronJob(models.Model): name = models.CharField(max_length=10, primary_key=True) last_ran = models.DateTimeField() 

settings.py :

 MIDDLEWARE = [ ... 'application.middleware.cron_middleware', ... ] 
0
25 янв. Atsakyti y-spreen 25 Jan 2019-01-25 15:13 '19, 13:13 pm 2019-01-25 15:13

Jei norite kažką patikimesniosalierus , pabandykite TaskHawk, kuris yra pastatytas ant AWS SQS / SNS .

Žr. Http://taskhawk.readthedocs.io

0
22 мая '18 в 2:53 2018-05-22 02:53 atsakymą pateikė Sriramas gegužės 22 d. 18 val. 2:53 2018-05-22 02:53