Выполнение неблокирующих запросов? - Django

В последнее время я играю с другими фреймворками, такими как NodeJS.

Мне нравится возможность вернуть ответ и все еще иметь возможность делать дальнейшие операции.

например.

def view(request):
  do_something()
  return HttpResponse()

  do_more_stuff() #not possible!!!

Возможно, Django уже предлагает способ выполнения операций после возврата запроса, если это так, это было бы здорово.


Помощь будет очень оценена!= D

Ответ 1

не из коробки, поскольку вы уже вернулись из метода. Вы можете использовать что-то вроде Celery, которое передало бы задачу do_more_stuff в очередь, а затем запустило бы ее do_more_stuff() вне потока запросов HTTP/ответа.

Ответ 2

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

Если вы занимаетесь выполнением многих асинхронных запросов и нуждаетесь в их неблокировании, вы можете проверить Tornado.

Ответ 3

Поскольку вы возвращаетесь из функции, do_more_stuff никогда не будет вызван.

Если вы смотрите на то, чтобы тяжело поднимать вещи, стоящие перед чем-то, прежде чем вернуться, как предлагает Росс (+1 для сельдерея).

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

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

Это сводится к тому, где бремя асинхронного сидения будет сидеть: клиент, сервер или ответ.

Я еще не знаком с node.js, но было бы интересно посмотреть пример использования, о котором вы говорите.

РЕДАКТИРОВАТЬ: Я немного искал сигналы, и, хотя они происходят в процессе, есть встроенный сигнал для request_finished после того, как запрос был обработан django, хотя он больше чем нечто конкретное.

Ответ 4

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

def foo(request):
    import threading
    from time import sleep
    def foo():
        sleep(5)
        # Do something
        print('hello, world')
    threading.Thread(target=foo).start()
    return JsonResponse(data={'detail': 'thread started'})