Ответ 1
не из коробки, поскольку вы уже вернулись из метода. Вы можете использовать что-то вроде Celery, которое передало бы задачу do_more_stuff
в очередь, а затем запустило бы ее do_more_stuff()
вне потока запросов HTTP/ответа.
В последнее время я играю с другими фреймворками, такими как NodeJS.
Мне нравится возможность вернуть ответ и все еще иметь возможность делать дальнейшие операции.
например.
def view(request):
do_something()
return HttpResponse()
do_more_stuff() #not possible!!!
Возможно, Django уже предлагает способ выполнения операций после возврата запроса, если это так, это было бы здорово.
Помощь будет очень оценена!= D
не из коробки, поскольку вы уже вернулись из метода. Вы можете использовать что-то вроде Celery, которое передало бы задачу do_more_stuff
в очередь, а затем запустило бы ее do_more_stuff()
вне потока запросов HTTP/ответа.
Django позволяет выполнить это с помощью сигналов, более подробную информацию можно найти здесь. (Обратите внимание, что, как я уже сказал в комментариях ниже, сигналы не являются блокирующими, но они позволяют выполнять код после возвращения ответа в виде.)
Если вы занимаетесь выполнением многих асинхронных запросов и нуждаетесь в их неблокировании, вы можете проверить Tornado.
Поскольку вы возвращаетесь из функции, do_more_stuff никогда не будет вызван.
Если вы смотрите на то, чтобы тяжело поднимать вещи, стоящие перед чем-то, прежде чем вернуться, как предлагает Росс (+1 для сельдерея).
если, однако, вы хотите вернуть какой-то контент... тогда что-то делать и возвращать больше контента для потоковой передачи пользователей - это, вероятно, то, что вы ищете. Вы можете передать итератору или генератору HttpResponse, и он будет перебирать и выталкивать контент в тонкой манере. Он чувствует себя немного, но если вы генератор rockstar, вы можете сделать достаточно в разных штатах, чтобы выполнить то, что хотите.
Или, я думаю, вы могли бы просто перепроектировать свою страницу, чтобы использовать много аякс, чтобы делать то, что вам нужно, включая отключение событий до представлений django, чтение данных из представлений и т.д.
Это сводится к тому, где бремя асинхронного сидения будет сидеть: клиент, сервер или ответ.
Я еще не знаком с node.js, но было бы интересно посмотреть пример использования, о котором вы говорите.
РЕДАКТИРОВАТЬ: Я немного искал сигналы, и, хотя они происходят в процессе, есть встроенный сигнал для request_finished после того, как запрос был обработан django, хотя он больше чем нечто конкретное.
Вы можете использовать потоки как временное исправление или как непроизводственное решение, но оно не является ни масштабируемым, ни лучшим. Используйте сельдерей для лучшего дизайна!
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'})