Django celery बीट का उपयोग करके समय-समय पर django में कुछ कार्य कैसे शेड्यूल करें?

वोट
0

अजवाइन के साथ यह मेरा पहला प्रयास है इसलिए स्पष्ट रूप से कुछ मुद्दे हैं। यहां मैं बनाना चाहता हूं Task Object डेटाबेस में हर 1 मिनट तो मैंने इस्तेमाल किया django-celery-beat । मैं बाद में कस्टम शेड्यूलर क्लास का उपयोग करना चाहता हूं इसलिए इस उद्देश्य के लिए मैंने django-celery-beat पैकेज का उपयोग किया। लेकिन मुझे परिणाम नहीं मिल रहे हैं।

मैंने टास्कमॉडल ऑब्जेक्ट बनाने के लिए django फॉर्म का उपयोग किया और हर 1 मिनट में व्यू को चलाने के लिए टास्कटाइम में एक टास्क लिखा। लेकिन यह इस त्रुटि को फेंकता है

Exception Type: EncodeError
Exception Value:    
Object of type timedelta is not JSON serializable

मैंने कमांड के साथ एक कंसोल में अजवाइन शुरू किया $ celery -A celery_demo beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler और कमांड के साथ दूसरे कंसोल में django सर्वर शुरू किया py manage.py runserver

settings.py

CELERY_BROKER_URL = 'amqp://localhost'

CELERY_BEAT_SCHEDULE = {

        'task-first': {
        'task': 'scheduler.tasks.create_task',
        'schedule': timedelta(minutes=1)
       },

celery.py

from __future__ import absolute_import, unicode_literals

import os

from celery import Celery

# set the default Django settings module for the 'celery' program.
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celery_demo.settings')

app = Celery('celery_demo')

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks(settings.INSTALLED_APPS)


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

init .py

from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ('celery_app',)

एप्लिकेशन / tasks.py

from celery.task import task
from django.shortcuts import redirect, render

from scheduler.models import Task

@task(name='create_task')
def add_task_celery(name=None, date=None, frequency=None):
    Task.objects.create(name=name, date=date, frequency=frequency)
    return redirect('list_tasks')

appp / views.py

def add_task(request):
    form = AddTaskForm()
    if request.method == 'POST':
        form = AddTaskForm(request.POST)
        if form.is_valid():
            name = form.cleaned_data.get('name')
            date = form.cleaned_data.get('date')
            freq = form.cleaned_data.get('frequency')

            add_task_celery.delay(name,date,freq)
    return render(request, 'add_task.html', {'form': form})

मॉडल

class Task(models.Model):
    name = models.CharField(max_length=255)
    date = models.DateField()
    frequency = models.DurationField()
    is_completed = models.BooleanField(default=False)
    is_running = models.BooleanField(default=False)
01/06/2020 को 16:04
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


1 जवाब

वोट
0

समस्या कार्य परिभाषा में तीसरे पैरामीटर के साथ है, जो है freq और यह प्रकार की टाइमडेल्टा है। https://docs.djangoproject.com/en/3.0/ref/models/fields/#durationfield

यह कार्य करने के लिए पारित करने से पहले क्रमबद्ध होना चाहिए। एक सरल तरीका होगा।

1) आप इस क्षेत्र को स्पष्ट रूप से अनुक्रमित कर सकते हैं और पास कर सकते हैं, कार्य में फिर से इसे टाइमडेल्टा ऑब्जेक्ट में बदल सकते हैं।

2) एक और चीज जो आप आजमा सकते हैं, वह यह है कि स्पष्ट रूप से मापदंडों में धारावाहिक को पास करना है।

add_task_celery.delay(name,date,freq, serializer='json')

3) आप CELERY_TASK_SERIALIZER = 'json' सेट करने के लिए एक मान भी निर्धारित कर सकते हैं (डिफ़ॉल्ट मान अचार है)

04/06/2020 को 07:59
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more