Вы можете опубликовать большой объем данных, установив переменную php.ini: max_input_vars
Размер по умолчанию этой переменной - 1000, но если вы хотите отправить большой объем данных, вы должны соответственно увеличить размер. Если вы не можете установить размер из ini_set, вам нужно сделать это через htaccess
или внести изменения в файл php.ini напрямую.
max_input_vars 2500
memory_limit 256M
Вы создали отдельный поток и он выполняет действие.
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 и завершите начальный поток. Например, он может отправить электронное письмо, не откладывая ответ.
Если у вас есть длительно выполняющийся процесс, у вас есть два простых варианта.
Создать подпроцесс перед отправкой страницы ответа.
Создать «демона фоновой службы» и передать рабочие запросы к нему.
Это все вне Django. Вы используете подпроцесс или какой-либо другой метод IPC для связи с другим процессом.
Обычный способ сделать это - использовать очереди сообщений. Вы помещаете сообщение в очередь, а рабочие потоки (или процессы и т. Д.) Используют очередь и выполняют работу после завершения представления.
Google App Engine имеет api очереди задач http: // code .google.com / appengine / docs / python / taskqueue / , в amazon есть служба простой очереди http://aws.amazon.com/sqs/ .
Быстрый поиск не обнаружил никаких подключаемых модулей django, которые выглядели бы как принятые стандарты.
Быстрый и грязный способ имитации функциональности - это поместить «сообщение» в таблицу базы данных и попросить задание cron периодически проверять таблицу для выполнения работы.
Мое любимое решение: отдельный процесс, который обрабатывает фоновые задачи, обычно такие вещи, как индексирование и отправка писем с уведомлениями и т. Д. А затем, во время рендеринга представления, вы отправляете событие в систему обработки событий ( Я не знаю, есть ли в Django один встроенный, но он вам всегда нужен, поэтому он должен быть у вас), а четная система затем помещает сообщение в очередь сообщений (что тривиально для записи, если у вас нет нескольких машин или нескольких фоновых процессы), который выполняет рассматриваемую задачу.
Объект 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())
Итератор обычно используется для отправки больших данных, не считывая их все в память. Например, читать фрагменты из файла и соответственно уступать. Я никогда не использовал его таким образом, но похоже, что он должен работать.
Возможно, я не понимаю вашего вопроса. Но почему бы не что-нибудь простое, например:
try:
return render_to_response()
finally:
do_what_needs_to_be_done()
При рендеринге в ответ вы передаете html-страницу, которую хотите отобразить. Эта другая страница должна отправить сообщение (через Javascript или что-то еще), которое запускает правильную функцию в ваших представлениях, затем это представление вызывает правильную следующую страницу для отображения.