Cum să programați periodic o sarcină în django folosind ritm de țelină django?

voturi
0

Aceasta este prima mea încercare cu țelina, astfel încât, în mod evident, există anumite probleme. Aici vreau să creez Task Object la fiecare 1 minute în baza de date așa că am folosit django-celery-beat . Vreau să folosesc mai târziu clasa de planificare personalizată, așa că, în acest scop, am folosit pachetul django-celery-beat. Dar nu obțin rezultatele.

Am folosit formularul django pentru a crea obiectul TaskModel și am scris o sarcină în task.py pentru a rula vizualizarea la fiecare 1 minut. Dar aruncă această eroare

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

Am început țelina într-o singură consolă cu comanda $ celery -A celery_demo beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler și a început serverul django într-o altă consolă cu comandă 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',)

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

modele

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)
Întrebat 01/06/2020 la 16:04
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
0

Problema este cu al treilea parametru în definiția sarcinii, care este freq iar aceasta este de tip timedelta. https://docs.djangoproject.com/en/3.0/ref/models/fields/#durationfield

Aceasta trebuie serializată înainte de a trece la sarcină. un mod simplu ar fi.

1) puteți serializa în mod explicit acest câmp și trece, în sarcină îl convertiți din nou în obiect timedelta.

2) un alt lucru pe care îl puteți încerca este să treceți serializatorul în parametri în mod explicit.

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

3) puteți, de asemenea, să setați o valoare pentru setarea CELERY_TASK_SERIALIZER = 'json' (valoarea implicită este pickle)

Publicat 04/06/2020 la 07:59
sursa de către utilizator

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