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

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

Я люблю возможность возвратить ответ и все еще способность сделать дальнейшие операции.

например.

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

  do_more_stuff() #not possible!!!

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


Справка очень ценилась бы!=D

11
задан RadiantHex 30 April 2010 в 08:51
поделиться

3 ответа

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

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

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

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

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

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

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

2
ответ дан 3 December 2019 в 05:57
поделиться

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

10
ответ дан 3 December 2019 в 05:57
поделиться

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

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

7
ответ дан 3 December 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: