Как выполнить код в Django после того, как ответ был отправлен клиенту (на PythonAnywhere)? - PullRequest
0 голосов
/ 18 мая 2019

Я ищу способ выполнить код в Django после того, как ответ был отправлен клиенту.Я знаю, что обычным способом является реализация очереди задач (например, Celery).Однако используемый мной сервис PaaS (PythonAnywhere) не поддерживает очереди задач по состоянию на май 2019 года. Он также кажется слишком сложным для нескольких простых случаев использования.Я нашел следующее решение для SO: Выполнить код в Django после того, как ответ был отправлен клиенту .Принятый ответ прекрасно работает, когда работает локально.Однако в производственной среде PythonAnywhere он по-прежнему блокирует отправку ответа клиенту.Что вызывает это?

Вот моя реализация:

from time import sleep
from datetime import datetime
from django.http import HttpResponse

class HttpResponseThen(HttpResponse): 
    """
    WARNING: THIS IS STILL BLOCKING THE PAGE LOAD ON PA
    Implements HttpResponse with a callback i.e.,
    The callback function runs after the http response.
    """
    def __init__(self, data, then_callback=lambda: 'hello world', **kwargs):
        super().__init__(data, **kwargs)
        self.then_callback = then_callback

    def close(self):
        super().close()
        return_value = self.then_callback()
        print(f"Callback return value: {return_value}")

def my_callback_function():
    sleep(20)
    print('This should print 20 seconds AFTER the page loads.')
    print('On PA, the page actually takes 20 seconds to load')

def test_view(request):
    return HttpResponseThen("Timestamp: "+str(datetime.now()), 
        then_callback=my_callback_function)  # This is still blocking on PA

Я ожидаю, что ответ будет отправлен клиенту немедленно, но на самом деле страница занимает целых 20 секунднагрузки.(На моем ноутбуке код работает отлично. Ответ отправляется немедленно, а операторы печати выполняются через 20 секунд.)

...