اذهب إلى المحتوى

السؤال

نشر

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

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

Recommended Posts

  • 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
  • 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

 

  • 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),
    },
}

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...