• 0

كيفية تنفيذ مهمة معينة بشكل دوري في Django؟

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

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

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

يمكنك القيام بذلك كالتالي: أولاً إنشاء " custom management command " ، على سبيل المثال:

python manage.py my_cool_command

واستخدم cron على Linux أو at  على Windows لتشغيل الأمر الخاص بك في الوقت الذي تحتاجه.ويعمل حل cron بشكل جيد جداً مع التطبيقات الصغيرة والمتوسطة الحجم وحيث لا تريد الكثير من التبعيات الخارجية. وهو حل بسيط لا يتطلب تثبيت مكدس AMQP. أيضاً يمكنك استخدام Celery وهو عبارة عن قائمة انتظار مهام موزعة ، مبنية على AMQP (RabbitMQ). كما أنه يتعامل مع المهام الدورية بطريقة تشبه كرون. ومن السهل جداً إعداد Celery باستخدام django ، وستتخطى المهام الدورية فعلياً المهام الفائتة في حالة حدوث تعطل. يحتوي Celery أيضاً على آليات إعادة المحاولة المضمنة، في حالة فشل المهمة.

تمّ تعديل بواسطة Ali Haidar Ahmad
1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

بالإضافة لما تم شرحه في التعليق السابق يمكنك استخدام مكتبة مثل APScheduler حيث تسهل عليك عمل مثل هذه المهام لاحظ المثال التالي

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

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

يمكنك استخدام celery لتنفيذ المطلوب

pip install -U Celery

لاستدعاء مهمة بشكل دوري ، يجب عليك إضافة إدخال إلى قائمة beat schedule.

from celery import Celery
from celery.schedules import crontab

app = Celery()

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # Calls test('hello') every 10 seconds.
    sender.add_periodic_task(10.0, test.s('hello'), name='add every 10')

    # Calls test('world') every 30 seconds
    sender.add_periodic_task(30.0, test.s('world'), expires=10)

    # Executes every Monday morning at 7:30 a.m.
    sender.add_periodic_task(
        crontab(hour=7, minute=30, day_of_week=1),
        test.s('Happy Mondays!'),
    )

@app.task
def test(arg):
    print(arg)

@app.task
def add(x, y):
    z = x + y
    print(z)

يمكنك الجدولة كل يوم اثنين مثلا 

from celery.schedules import crontab

app.conf.beat_schedule = {
    # Executes every Monday morning at 7:30 a.m.
    'add-every-monday-morning': {
        'task': 'tasks.add',
        'schedule': crontab(hour=7, minute=30, day_of_week=1),
        'args': (16, 16),
    },
}

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن