Hoe kun je een taak in django periodiek plannen met behulp van de django-selderklopper?

stemmen
0

Dit is mijn eerste poging met de selderij, dus er zijn duidelijk wat problemen. Hier wil ik elke 1 minuut in de database aanmaken Task Objectdus ik gebruikte django-celery-beat. Ik wil later gebruik maken van aangepaste scheduler klasse dus voor dit doel heb ik gebruik gemaakt van de django-celery-beat pakket Maar ik krijg de resultaten niet.

Ik heb het django formulier gebruikt om het TaskModel object te maken en een taak te schrijven in tasks.py om de weergave elke 1 minuut uit te voeren. Maar het gooit deze fout

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

Ik begon selderij in een console met het commando $ celery -A celery_demo beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduleren startte de django-server in een andere console met het commando 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)
       },

selderij.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))

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

modellen

id=pre-6
De vraag is gesteld op 01/06/2020 om 16:04
bron van user
In andere talen...                            


1 antwoorden

stemmen
0

Het probleem is met de derde parameter in de taakomschrijving, die is freqen dit is van het type timedelta. https://docs.djangoproject.com/en/3.0/ref/models/fields/#durationfield

Dit moet worden geserialiseerd vooraleer over te gaan tot de taak. een eenvoudige manier zou zijn.

1) u kunt dit veld expliciet serialiseren en doorgeven, in de taak opnieuw converteren naar timedelta object.

2) een ander ding dat u kunt proberen is om de serializer in de parameters expliciet door te geven.

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

3) je kunt ook een waarde instellen voor het instellen van CELERY_TASK_SERIALIZER = 'json' (standaardwaarde is augurk)

antwoordde op 04/06/2020 om 07:59
bron van user

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