Django kereviz beat kullanarak periyodik olarak django bazı görev zamanlamak nasıl?

oy
0

Bu kereviz ile ilk denemem bu yüzden açıkçası bazı sorunlar var. Burada yaratmak istiyorum Task Object veritabanında her 1 dakikada bir kullandım django-celery-beat . Özel zamanlayıcı sınıfını daha sonra kullanmak istiyorum, bu nedenle django-celery-beat paketini kullandım. Ama sonuçları alamıyorum.

TaskModel nesnesini oluşturmak ve görünümü 1 dakikada bir çalıştırmak için task.py'de bir görev yazmak için django formunu kullandım. Ama bu hatayı atıyor

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

Kereviz komutunu bir konsolda başlattım $ celery -A celery_demo beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler ve django sunucusunu başka bir konsolda komutla başlattı 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',)

Uygulamanın / 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})

modeller

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)
Oluştur 01/06/2020 saat 16:04
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
0

Sorun, görev tanımındaki üçüncü parametre ile ilgilidir. freq ve bu tür timedelta. https://docs.djangoproject.com/en/3.0/ref/models/fields/#durationfield

Göreve geçmeden önce bunun serileştirilmesi gerekir. basit bir yol olurdu.

1) bu alanı açıkça serileştirebilir ve geçirebilirsiniz, görevde tekrar timedelta nesnesine dönüştürebilirsiniz.

2) deneyebileceğiniz başka bir şey, serileştiriciyi parametrelerde açıkça geçirmektir.

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

3) CELERY_TASK_SERIALIZER = 'json' ayarı için bir değer de ayarlayabilirsiniz (varsayılan değer turşudur)

Cevap 04/06/2020 saat 07:59
kaynak kullanıcı

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