Saya telah bekerja pada aplikasi web menggunakan Django, dan saya ingin tahu apakah ada cara untuk menjadwalkan pekerjaan untuk dijalankan secara berkala.
Pada dasarnya saya hanya ingin menjalankan melalui database dan membuat beberapa perhitungan / pembaruan secara otomatis, secara teratur, tetapi sepertinya saya tidak dapat menemukan dokumentasi untuk melakukan hal ini.
Adakah yang tahu cara mengatur ini?
Untuk memperjelas: Saya tahu saya dapat mengatur cron
pekerjaan untuk melakukan ini, tapi saya ingin tahu apakah ada beberapa fitur di Django yang menyediakan fungsi ini. Saya ingin orang dapat menggunakan aplikasi ini sendiri tanpa harus melakukan banyak konfigurasi (sebaiknya nol).
Saya telah mempertimbangkan untuk memicu tindakan ini "surut" dengan hanya memeriksa apakah suatu pekerjaan seharusnya sudah dijalankan sejak terakhir kali permintaan dikirim ke situs, tetapi saya berharap untuk sesuatu yang sedikit lebih bersih.
Jawaban:
Salah satu solusi yang saya gunakan adalah melakukan ini:
1) Buat perintah manajemen kustom , mis
2) Gunakan
cron
(di Linux) atauat
(di Windows) untuk menjalankan perintah saya pada waktu yang diperlukan.Ini adalah solusi sederhana yang tidak perlu menginstal tumpukan AMQP yang berat. Namun ada keuntungan bagus menggunakan sesuatu seperti Celery, yang disebutkan dalam jawaban lain. Secara khusus, dengan Seledri itu baik untuk tidak harus menyebarkan logika aplikasi Anda ke file crontab. Namun solusi cron bekerja cukup baik untuk aplikasi kecil hingga menengah dan di mana Anda tidak ingin banyak ketergantungan eksternal.
EDIT:
Di versi Windows yang lebih baru
at
perintahnya sudah tidak digunakan lagi untuk Windows 8, Server 2012 dan di atasnya. Anda dapat menggunakanschtasks.exe
untuk penggunaan yang sama.**** PEMBARUAN **** Ini tautan baru django doc untuk menulis perintah manajemen kustom
sumber
python manage.py runcrons
yang kemudian menjalankan semua crons yang telah Anda tetapkan dan terdaftar.Selery adalah antrian tugas terdistribusi, dibangun di atas AMQP (RabbitMQ). Itu juga menangani tugas-tugas berkala dengan cara yang mirip cron (lihat tugas-tugas berkala ). Tergantung pada aplikasi Anda, itu mungkin layak dilihat.
Seledri cukup mudah untuk diatur dengan Django ( dokumen ), dan tugas-tugas berkala benar-benar akan melewatkan tugas yang terlewat jika terjadi downtime. Selery juga memiliki mekanisme coba lagi bawaan, jika tugasnya gagal.
sumber
Kami telah open-source yang saya pikir adalah aplikasi terstruktur. bahwa solusi Brian di atas juga menyinggung. Kami akan sangat menyukai setiap / semua umpan balik!
https://github.com/tivix/django-cron
Itu datang dengan satu perintah manajemen:
Itu berhasil. Setiap cron dimodelkan sebagai kelas (jadi semuanya OO) dan masing-masing cron berjalan pada frekuensi yang berbeda dan kami memastikan jenis cron yang sama tidak berjalan secara paralel (seandainya crons sendiri membutuhkan waktu lebih lama untuk berjalan daripada frekuensinya!)
sumber
at
atau itu dirancang khusus untuk bekerja dengancron
?Jika Anda menggunakan OS POSIX standar, Anda menggunakan cron .
Jika Anda menggunakan Windows, Anda gunakan di .
Tulis perintah manajemen Django ke
Cari tahu apa platform mereka.
Baik jalankan perintah "AT" yang sesuai untuk pengguna Anda, atau perbarui crontab untuk pengguna Anda.
sumber
Aplikasi Django pluggable baru yang menarik: Django-chronograph
Anda hanya perlu menambahkan satu entri cron yang bertindak sebagai penghitung waktu, dan Anda memiliki antarmuka admin Django yang sangat bagus ke dalam skrip untuk dijalankan.
sumber
Lihatlah Django Poor Man's Cron yang merupakan aplikasi Django yang menggunakan robot spam, robot pengindeksan mesin pencari dan juga untuk menjalankan tugas terjadwal dalam interval yang kurang lebih teratur
Lihat: http://code.google.com/p/django-poormanscron/
sumber
Saya memiliki persyaratan yang persis sama beberapa waktu lalu, dan akhirnya menyelesaikannya menggunakan APScheduler ( Panduan Pengguna )
Itu membuat pekerjaan penjadwalan super sederhana, dan membuatnya independen untuk dari eksekusi berdasarkan permintaan beberapa kode. Berikut ini adalah contoh sederhana.
Semoga ini bisa membantu seseorang!
sumber
Saran Brian Neal untuk menjalankan perintah manajemen melalui cron bekerja dengan baik, tetapi jika Anda mencari sesuatu yang sedikit lebih kuat (namun tidak serumit Celery) saya akan melihat ke perpustakaan seperti Kronos :
sumber
RabbitMQ dan Celery memiliki lebih banyak fitur dan kemampuan penanganan tugas daripada Cron. Jika kegagalan tugas tidak menjadi masalah, dan Anda pikir Anda akan menangani tugas yang rusak di panggilan berikutnya, maka Cron sudah cukup.
Seledri & AMQP akan membiarkan Anda menangani tugas yang rusak, dan itu akan dieksekusi lagi oleh pekerja lain (pekerja Seledri mendengarkan tugas berikutnya untuk dikerjakan), sampai
max_retries
atribut tugas tercapai. Anda bahkan dapat menjalankan tugas pada kegagalan, seperti mencatat kegagalan, atau mengirim email ke admin setelahmax_retries
tercapai.Dan Anda dapat mendistribusikan server Seledri dan AMQP ketika Anda perlu mengatur skala aplikasi Anda.
sumber
Saya pribadi menggunakan cron, tetapi bagian Penjadwalan Pekerjaan dari Django-ekstensi terlihat menarik.
sumber
Meskipun bukan bagian dari Django, Airflow adalah proyek yang lebih baru (per 2016) yang berguna untuk manajemen tugas.
Airflow adalah sistem otomatisasi dan penjadwalan alur kerja yang dapat digunakan untuk membuat dan mengelola saluran data. UI berbasis web memberi pengembang sejumlah pilihan untuk mengelola dan melihat saluran pipa ini.
Aliran udara ditulis dengan Python dan dibangun menggunakan Flask.
Airflow dibuat oleh Maxime Beauchemin di Airbnb dan bersumber terbuka pada musim semi 2015. Airflow bergabung dengan program inkubasi Apache Software Foundation pada musim dingin 2016. Berikut adalah halaman proyek Git dan beberapa informasi latar belakang tambahan .
sumber
Letakkan yang berikut di bagian atas file cron.py Anda:
sumber
Saya hanya memikirkan solusi yang agak sederhana ini:
Anda dapat menambahkan parameter tetapi hanya menambahkan parameter ke URL.
Katakan apa yang kalian pikirkan.
[Perbarui] Saya sekarang menggunakan perintah runjob dari django-extensions bukan curl.
Cron saya terlihat seperti ini:
... dan seterusnya untuk harian, bulanan, dll. Anda juga dapat mengaturnya untuk menjalankan pekerjaan tertentu.
Saya merasa lebih mudah diatur dan lebih bersih. Tidak memerlukan pemetaan URL untuk dilihat. Cukup tentukan kelas pekerjaan Anda dan crontab dan Anda sudah siap.
sumber
setelah bagian kode, saya bisa menulis apa saja seperti views.py saya :)
dari http://www.cotellese.net/2007/09/27/running-external-scripts-against-django-models/
sumber
Anda pasti harus memeriksa Django-q! Ini tidak memerlukan konfigurasi tambahan dan sangat mungkin semua yang diperlukan untuk menangani masalah produksi pada proyek komersial.
Ini aktif dikembangkan dan terintegrasi dengan sangat baik dengan Django, Django ORM, Mongo, Redis. Ini konfigurasi saya:
sumber
Django APScheduler untuk Pekerjaan Penjadwal. Penjadwal Python Lanjutan (APScheduler) adalah pustaka Python yang memungkinkan Anda menjadwalkan kode Python Anda untuk dieksekusi nanti, baik hanya sekali atau secara berkala. Anda dapat menambahkan pekerjaan baru atau menghapus yang lama dengan cepat.
catatan: Saya penulis perpustakaan ini
Instal APScheduler
Lihat fungsi file untuk memanggil
nama file: scheduler_jobs.py
Mengkonfigurasi penjadwal
buat file execut.py dan tambahkan kode di bawah ini
Fungsi tertulis Anda Di sini, fungsi scheduler ditulis dalam scheduler_jobs
Tautkan File untuk Eksekusi
Sekarang, tambahkan baris di bawah ini di bagian bawah file Url
sumber
Saya memiliki sesuatu yang mirip dengan masalah Anda hari ini.
Saya tidak ingin itu ditangani oleh server trhough cron (dan sebagian besar Lib hanya pembantu cron pada akhirnya).
Jadi saya telah membuat modul penjadwalan dan melampirkannya di init .
Ini bukan pendekatan terbaik, tetapi ini membantu saya untuk memiliki semua kode di satu tempat dan dengan eksekusi yang terkait dengan aplikasi utama.
sumber
Ya, metode di atas sangat bagus. Dan saya mencoba beberapa dari mereka. Akhirnya, saya menemukan metode seperti ini:
Sama seperti Rekursif .
Ok, saya harap metode ini dapat memenuhi kebutuhan Anda. :)
sumber
Solusi yang lebih modern (dibandingkan dengan Seledri) adalah Django Q: https://django-q.readthedocs.io/en/latest/index.html
Ini memiliki dokumentasi yang bagus dan mudah untuk grok. Dukungan Windows kurang, karena Windows tidak mendukung proses forking. Tapi itu berfungsi dengan baik jika Anda membuat lingkungan dev Anda menggunakan Subsistem Windows untuk Linux.
sumber
Saya menggunakan seledri untuk membuat tugas berkala saya. Pertama, Anda perlu menginstalnya sebagai berikut:
Jangan lupa untuk mendaftar
django-celery
di pengaturan Anda dan kemudian Anda dapat melakukan sesuatu seperti ini:sumber
Saya tidak yakin apakah ini akan berguna bagi siapa pun, karena saya harus menyediakan pengguna lain dari sistem untuk menjadwalkan pekerjaan, tanpa memberi mereka akses ke Penjadwal Tugas server (windows), saya membuat aplikasi yang dapat digunakan kembali ini.
Harap perhatikan pengguna memiliki akses ke satu folder bersama di server tempat mereka dapat membuat file perintah / tugas / .bat yang diperlukan. Tugas ini kemudian dapat dijadwalkan menggunakan aplikasi ini.
Nama aplikasi adalah Django_Windows_Scheduler
Tangkapan Layar:
sumber
Jika Anda menginginkan sesuatu yang lebih dapat diandalkan daripada Seledri , coba TaskHawk yang dibangun di atas AWS SQS / SNS .
Rujuk: http://taskhawk.readthedocs.io
sumber
Untuk proyek-proyek buruh pelabuhan sederhana, saya tidak bisa benar-benar melihat jawaban yang sesuai.
Jadi saya menulis solusi yang sangat barebones tanpa perlu perpustakaan atau pemicu eksternal, yang berjalan sendiri. Tidak diperlukan os-cron eksternal, harus bekerja di setiap lingkungan.
Ini berfungsi dengan menambahkan middleware:
middleware.py
models/cron.py
:settings.py
:sumber
Cara sederhana adalah dengan menulis perintah shell kustom lihat Django Documentation dan jalankan dengan menggunakan cronjob di linux. Namun saya sangat merekomendasikan menggunakan broker pesan seperti RabbitMQ ditambah dengan seledri. Mungkin Anda bisa melihat Tutorial ini
sumber