python - دجانجو-تعيين وظيفة مجدولة؟




django web-applications (13)

أنا أعمل على تطبيق ويب باستخدام Django ، وأنا أشعر بالفضول إذا كان هناك طريقة لجدولة مهمة لتشغيلها بشكل دوري.

في الأساس ، أريد فقط تشغيل قاعدة البيانات وإجراء بعض الحسابات / التحديثات على أساس تلقائي ومنتظم ، ولكن لا يمكنني العثور على أي مستندات حول إجراء ذلك.

لا أحد يعرف كيفية إعداد هذا؟

للتوضيح: أعلم أنه يمكنني إعداد مهمة cron للقيام بذلك ، ولكنني أشعر بالفضول إذا كان هناك ميزة في Django توفر هذه الوظيفة. أريد أن يتمكن الأشخاص من نشر هذا التطبيق بأنفسهم دون الاضطرار إلى إجراء الكثير من التهيئة (ويفضل أن يكون الصفر).

لقد فكرت في تشغيل هذه الإجراءات "بأثر رجعي" بمجرد التحقق مما إذا كان يجب تشغيل مهمة ما منذ آخر مرة تم فيها إرسال طلب إلى الموقع ، ولكنني آمل في الحصول على شيء أكثر نظافة.


أحد الحلول التي استخدمتها هو القيام بذلك:

1) إنشاء أمر إدارة مخصص ، على سبيل المثال

python manage.py my_cool_command

2) استخدم cron (على Linux) أو (على Windows) لتشغيل أمري في الأوقات المطلوبة.

هذا حل بسيط لا يتطلب تثبيت حزمة AMQP ثقيلة. ومع ذلك هناك مزايا لطيفة لاستخدام شيء مثل الكرفس ، المذكورة في الإجابات الأخرى. على وجه الخصوص ، مع الكرفس فمن الجميل أن لا يكون لديك لنشر منطق التطبيق الخاص بك إلى ملفات crontab. ومع ذلك ، يعمل حل cron بشكل رائع لتطبيق صغير إلى متوسط ​​الحجم وحيث لا تريد الكثير من التبعيات الخارجية.

تصحيح:

في الإصدار الأحدث من النوافذ ، تم إيقاف الأمر at لـ Windows 8 و Server 2012 والإصدارات الأحدث. يمكنك استخدام schtasks.exe لنفس الاستخدام.


أستخدم الكرفس لإنشاء المهام الدورية الخاصة بي. تحتاج أولاً إلى تثبيته على النحو التالي:

pip install django-celery

لا تنسى أن تسجل django-celery في إعداداتك ومن ثم يمكنك فعل شيء كالتالي:

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

إذا كنت تستخدم نظام POSIX القياسي ، فإنك تستخدم cron .

إذا كنت تستخدم Windows ، فأنت تستخدم at .

اكتب أمر إدارة جانغو إلى

  1. اكتشف النظام الأساسي الذي تستخدمه.

  2. إما تنفيذ الأمر "AT" المناسب للمستخدمين أو تحديث crontab لمستخدميك.


إلقاء نظرة على Django Poor Man's Cron وهو تطبيق Django الذي يستفيد من spambots وبرامج الروبوت لفهرسة محركات البحث وعلى حد سواء لتشغيل المهام المجدولة في فترات منتظمة تقريبا

راجع: http://code.google.com/p/django-poormanscron/


بعد جزء الرمز ، يمكنني كتابة أي شيء مثل مشاهدات .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/


حل أكثر حداثة (مقارنة مع الكرفس) هو دجانجو س: https://django-q.readthedocs.io/en/latest/index.html

لديها وثائق رائعة وسهلة تخنق. دعم Windows غير موجود ، لأن Windows لا يدعم عملية التزوير. لكنه يعمل بشكل جيد إذا قمت بإنشاء بيئة التطوير الخاصة بك باستخدام Windows لنظام Linux الفرعي.


على الرغم من أن Airflow ليس جزءًا من Django ، إلا أنه مشروع أحدث (اعتبارًا من عام 2016) يفيد في إدارة المهام.

Airflow هو نظام أتمتة سير العمل والجدولة التي يمكن استخدامها لتأليف وإدارة خطوط البيانات. توفر واجهة المستخدم المستندة إلى الويب للمطوِّر مجموعة من الخيارات لإدارة وعرض خطوط الأنابيب هذه.

تتم كتابة تدفق الهواء في بايثون ويتم بناؤه باستخدام قارورة.

تم إنشاء Airflow بواسطة Maxime Beauchemin في Airbnb ومفتوحة المصدر في ربيع عام 2015. وانضم إلى برنامج حضانة مؤسسة Apache Software في شتاء عام 2016. هنا هي صفحة مشروع Git وبعض المعلومات الأساسية الإضافية.


كان لدي شيء مشابه لمشكلتك اليوم.

لم أكن أرغب في التعامل معها من قبل خادم trhough cron (وكان معظم من libs مجرد مساعدين كرون في النهاية).

لذلك قمت بإنشاء وحدة جدولة وإرفاقها إلى init .

إنها ليست الطريقة الأفضل ، ولكنها تساعدني في الحصول على كل الشفرات في مكان واحد ومع التنفيذ المتعلق بالتطبيق الرئيسي.


لدى RabbitMQ و Celery المزيد من الميزات وقدرات التعامل مع المهام أكثر من Cron. إذا لم يكن فشل المهمة مشكلة ، وكنت تعتقد أنك ستتعامل مع المهام المعطلة في المكالمة التالية ، فإن Cron كافية.

سيسمح لك الكرفس و AMQP بالتعامل مع المهمة المكسورة ، وسيتم تشغيلها مرة أخرى بواسطة عامل آخر (يستمع العاملون في Celery إلى المهمة التالية للعمل عليها) ، إلى أن يتم الوصول إلى سمة max_retries الخاصة max_retries . يمكنك حتى استدعاء المهام عند الفشل ، مثل تسجيل الفشل ، أو إرسال بريد إلكتروني إلى المسؤول بمجرد الوصول إلى max_retries .

ويمكنك توزيع خوادم Celery و AMQP عندما تحتاج إلى توسيع نطاق تطبيقك.


لست متأكدًا من أن هذا سيكون مفيدًا لأي شخص ، نظرًا لأنني اضطررت إلى تزويد المستخدمين الآخرين بالنظام لجدولة المهام ، دون منحهم إمكانية الوصول إلى خادم المهام الفعلي (windows) ، فقد قمت بإنشاء هذا التطبيق القابل لإعادة الاستخدام.

يرجى ملاحظة أن المستخدمين لديهم حق الوصول إلى مجلد مشترك واحد على الخادم حيث يمكنهم إنشاء ملف الأمر / المهمة / bat المطلوب. يمكن جدولة هذه المهمة بعد ذلك باستخدام هذا التطبيق.

اسم التطبيق هو Django_Windows_Scheduler

لقطة شاشة:


لقد فكرت في هذا الحل البسيط

  1. تحديد وظيفة عرض do_work (مسا ، معلمة) كما تفعل مع أي عرض آخر ، مع تعيين URL ، وإرجاع HttpResponse وهلم جرا.
  2. قم بإعداد مهمة cron مع تفضيلات التوقيت الخاصة بك (أو باستخدام AT أو المهام المجدولة في Windows) التي تقوم بتشغيل curl http://localhost/your/mapped/url?param=value .

يمكنك إضافة معلمات مع إضافة معلمات إلى عنوان URL فقط.

قل لي ما اعتقد يا رفاق.

[تحديث] أنا الآن باستخدام الأمر runjob من django-extensions بدلا من حليقة.

يبدو بلدي كرون شيء من هذا القبيل:

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

... وما إلى ذلك يوميًا وشهريًا وما إلى ذلك. يمكنك أيضًا إعدادها لتشغيل مهمة محددة.

أجد أنه أكثر سهولة وأنظف. لا يتطلب تعيين عنوان URL لطريقة عرض. ما عليك سوى تحديد فئة العمل الخاصة بك و crontab وتعيين.


مثيرة للاهتمام التطبيق الجديد للتوصيل دجانجو: django-chronograph

عليك فقط إضافة إدخال cron واحد يعمل كمؤقت ، ولديك واجهة جانجو admin لطيفة جدًا في البرامج النصية للتشغيل.


Celery هو طابور مهمة موزعة ، مبني على AMQP (RabbitMQ). كما أنه يعالج المهام الدورية بطريقة تشبه كرون (انظر المهام الدورية ). اعتمادًا على تطبيقك ، قد يكون الأمر يستحق

الكرفس سهلة التركيب مع django ( docs ) ، والمهام الدورية سوف تخطي المهام المفقودة في حالة التوقف. يحتوي الكرفس أيضًا على آليات إعادة محاولة مدمجة ، في حالة فشل مهمة.





scheduled-tasks