Как вы делаете что-то после рендеринга представления? (Джанго)

Вы можете опубликовать большой объем данных, установив переменную php.ini: max_input_vars Размер по умолчанию этой переменной - 1000, но если вы хотите отправить большой объем данных, вы должны соответственно увеличить размер. Если вы не можете установить размер из ini_set, вам нужно сделать это через htaccess или внести изменения в файл php.ini напрямую.

max_input_vars  2500
memory_limit    256M
10
задан geowa4 4 July 2009 в 03:23
поделиться

7 ответов

Вы создали отдельный поток и он выполняет действие.

t = threading.Thread(target=do_my_action, args=[my_argument])
# We want the program to wait on this thread before shutting down.
t.setDaemon(False)
t.start()

Это вызовет выполнение do_my_action (my_argument) во втором потоке, который будет продолжать работать даже после того, как вы отправите свой ответ Django и завершите начальный поток. Например, он может отправить электронное письмо, не откладывая ответ.

11
ответ дан 3 December 2019 в 16:54
поделиться

Если у вас есть длительно выполняющийся процесс, у вас есть два простых варианта.

  1. Создать подпроцесс перед отправкой страницы ответа.

  2. Создать «демона фоновой службы» и передать рабочие запросы к нему.

Это все вне Django. Вы используете подпроцесс или какой-либо другой метод IPC для связи с другим процессом.

5
ответ дан 3 December 2019 в 16:54
поделиться

Обычный способ сделать это - использовать очереди сообщений. Вы помещаете сообщение в очередь, а рабочие потоки (или процессы и т. Д.) Используют очередь и выполняют работу после завершения представления.

Google App Engine имеет api очереди задач http: // code .google.com / appengine / docs / python / taskqueue / , в amazon есть служба простой очереди http://aws.amazon.com/sqs/ .

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

Быстрый и грязный способ имитации функциональности - это поместить «сообщение» в таблицу базы данных и попросить задание cron периодически проверять таблицу для выполнения работы.

4
ответ дан 3 December 2019 в 16:54
поделиться

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

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

Объект HttpResponse Django принимает итератор в своем конструкторе:

http://docs.djangoproject.com/en/dev/ref/request-response/#passing-iterators

Таким образом, вы можете сделать что-то вроде:

def myiter():
    yield "my content"
    enqueue_some_task()
    return

def myview(request):
    return HttpResponse(myiter())

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

4
ответ дан 3 December 2019 в 16:54
поделиться

Возможно, я не понимаю вашего вопроса. Но почему бы не что-нибудь простое, например:

try:
    return render_to_response()
finally:
    do_what_needs_to_be_done()
-1
ответ дан 3 December 2019 в 16:54
поделиться

При рендеринге в ответ вы передаете html-страницу, которую хотите отобразить. Эта другая страница должна отправить сообщение (через Javascript или что-то еще), которое запускает правильную функцию в ваших представлениях, затем это представление вызывает правильную следующую страницу для отображения.

-1
ответ дан 3 December 2019 в 16:54
поделиться
Другие вопросы по тегам:

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