Как запустить долго выполняющуюся задачу за сценой в django class based view?

Я хочу запустить долго выполняющуюся задачу в Django на основе класса Redirectview. Перед завершением этой задачи я хочу вернуть шаблон. Вот мой код.

Я пробую с этим кодом.

class Redirect_to_page(RedirectView):
    async def sleep_long(self):
        for i in range(1,10):
            print(f'Run {i}')
            await asyncio.sleep(1)
        pass
    query_string = True
    pattern_name = 'pages:redirect_page'
    
    def get_redirect_url(self, *args, **kwargs):
        asyncio.run(self.sleep_long())
        print('This run before complete!')
        return super().get_redirect_url(*args, **kwargs)

и это результат.

Run 1
Run 2
Run 3
Run 4
Run 5
Run 6
Run 7
Run 8
Run 9
This run before complete!

Но я хочу получить результат типа_

Run 1
This run before complete!
Run 2
Run 3
Run 4
Run 5
Run 6
Run 7
Run 8
Run 9

Из вашего вопроса неясно, чего именно вы пытаетесь достичь. В целом, асинхронные задачи могут быть запущены путем интеграции сторонних рабочих. Celery является одним из них, который довольно популярен и имеет простые интеграции с django.

документы здесь: https://docs.celeryq.dev/en/stable/django/first-steps-with-django.html. простая запись в блоге здесь: https://realpython.com/asynchronous-tasks-with-django-and-celery/

У меня был большой опыт использования сельдерея, и я очень рекомендую.

Вы можете создать задачу, отвечающую за обработку вашей бизнес-логики, и диспетчеризировать эту задачу в вашем представлении.

Вернуться на верх