Πώς να προγραμματίσετε κάποια εργασία στο django χρησιμοποιώντας περιοδικά το σέλινο django;

ψήφοι
0

Αυτή είναι η πρώτη μου προσπάθεια με το σέλινο, οπότε υπάρχουν προφανώς κάποια ζητήματα. Εδώ θέλω να δημιουργήσω Task Object κάθε 1 λεπτό στη βάση δεδομένων, έτσι χρησιμοποίησα django-celery-beat . Θέλω να χρησιμοποιήσω προσαρμοσμένη τάξη προγραμματιστή αργότερα, γι 'αυτό το λόγο χρησιμοποίησα το πακέτο django-celery-beat. Αλλά δεν παίρνω τα αποτελέσματα.

Χρησιμοποίησα τη φόρμα django για να δημιουργήσω το αντικείμενο TaskModel και να γράψω μια εργασία στο task.py για να εκτελέσω την προβολή κάθε 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)
       },

σέλινο

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

στο .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 / task.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 και αυτό είναι τύπου timedelta. https://docs.djangoproject.com/en/3.0/ref/models/fields/#durationfield

Αυτό πρέπει να σειριοποιηθεί πριν περάσει στην εργασία. ένας απλός τρόπος θα ήταν.

1) μπορείτε να σειριοποιήσετε ρητά αυτό το πεδίο και να περάσετε, στην εργασία και πάλι να το μετατρέψετε σε αντικείμενο timedelta.

2) ένα άλλο πράγμα που μπορείτε να δοκιμάσετε είναι να περάσετε το πρόγραμμα σειριοποίησης στις παραμέτρους ρητά.

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

3) μπορείτε επίσης να ορίσετε μια τιμή για τη ρύθμιση CELERY_TASK_SERIALIZER = 'json' (η προεπιλεγμένη τιμή είναι pickle)

Απαντήθηκε 04/06/2020 στις 07:59
πηγή χρήστη

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