Сигнал Джанго для запуска задачи - PullRequest
0 голосов
/ 17 января 2019

Я сделал команду управления, которая заполняет одну из моих моделей из файла CSV.
Мне нужно делать это обновление довольно часто, а файлы csv содержат десятки тысяч строк.
Иногда заполнение может занять более 10 минут.

Я хочу добавить функцию, позволяющую загружать файл csv через веб-сайт напрямую, и после его загрузки django должен выполнить эту команду или хотя бы логику из нее и заполнить базу данных.

Как бы я поступил об этом? Я хочу иметь возможность покинуть страницу после загрузки файла и получить электронное письмо после завершения задачи.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Вы можете сделать то же самое с Django Background Task . Поддерживаемая базами данных рабочая очередь для Django. И проще в реализации, чем сельдерей.

from background_task import background
@background(schedule=60)
def your_task():
    # do your cool work here.

Это преобразует your_task в функцию фоновой задачи. Когда вы вызываете его из обычного кода, он фактически создает объект Task и сохраняет его в базе данных.

0 голосов
/ 17 января 2019

Использование Сельдерей

Ругли, это может выглядеть так:

app = Celery(<config stuff here>)

@app.task(name='my_task')
def my_task(self):
    do_stuff()

def my_view(*args, **kwargs):
    result = process_request()
    app.send_task('my_task')

Вам нужно будет создать задачу, зарегистрировать ее с помощью сельдерея (есть некоторая магия автообнаружения, которую вы можете использовать), а затем запустить задачу асинхронно из приложения django.

В процессе работы вы можете запустить сельдерей как процесс демона с помощью celeryd

...