2012-05-01 3 views
1

Есть ли простой способ сделать следующее?Django HttpResponse - ответ с файлом и содержимым

после получения запроса на вид, отправить обратно пользователю файл, а также повторно отображенный шаблон страницы? что-то вроде «слияния» réponse с файлом и render_to_response

Это, как я возвращаю ответ с файлом:

filename = "/path/to/somewhere" 
wrapper = FileWrapper(open(filename)) 
content_type = mimetypes.guess_type(filename)[0] 
response = HttpResponse(wrapper,content_type=content_type) 
response['Content-Length'] = os.path.getsize(filename) 
response['Content-Disposition'] = "attachment; filename=%s"%filename 
return response 

Это, как я вернуть обычный шаблон с оказанными данными:

data = getData() 
return render_to_response('../templates/some_template.html', {'data': data,}) 

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

вопрос: как мне «объединить» их обоих вместе? Есть ли простой способ сделать это с помощью стандартных функций django? Должен ли я использовать Ajax для этого? (Я не знаком с AJAX ... так что если есть способ сделать это без, это предпочтительнее)

Спасибо,

+1

Я не могу представить себе, что вы хотите, чтобы пользователь, чтобы увидеть/получить здесь. Как это будет работать? –

+0

Что вы просите, это два содержания в пределах одного ответа? Нет простого способа сделать это. Вероятно, вам стоит пойти с Ajax. –

+0

Daniel - У меня есть кнопка на странице, в которой я хочу, чтобы она выполняла 2 задания сразу - отправьте файл обратно пользователю и обновите раздел «div» на странице с новыми данными.возможно, то, что я предлагал здесь (с использованием сразу 2 запроса), не является решением, но приветствуется любая идея о том, как получить правильный пользовательский опыт. – nivniv

ответ

5

Если упростить вид протокола передачи гипертекста, то, как пользователи взаимодействуют с вашим приложением, отправив запрос, для которого ваше приложение предоставляет ответ. В разделе 4.2 of RFC 6266, когда вы возвращаете ответ, соответствующий типу «вложения», вы инструктируете клиента пользователя, чтобы он «предлагал пользователю сохранить ответ локально, а не обрабатывать его нормально».

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

Но, в остальном, если вы действительно хотите это сделать, вам нужно понять, что обслуживание файла и отображение нового документа HTML будут принимать два отдельных контекста запроса/ответа. Самый простой дизайн будет включать в себя, что страница, с которой пользователь собирается инициировать запрос на извлечение файла, также подписывается на приложение, которое должно быть уведомлено, когда пользователь загрузил файл в завершение, а затем уходит, чтобы отобразить новое содержимое или перенаправить на новую страницу.

+0

Вау, спасибо за этот отличный ответ! Я предположил, что для этого мне понадобится как минимум 2 ответа. Как вы реализуете то, что вы сказали в третьем абзаце в django? – nivniv

+1

Основная идея заключается в том, что после получения запроса на начальную целевую страницу, с которой клиент пользователя инициирует другой запрос на загрузку файла, вы будете готовить и указывать URL-адрес в ответе на целевую страницу, а затем использовать клиент- чтобы либо опросить, либо подписаться на этот URL, чтобы определить, когда этот конкретный пользователь загрузил этот конкретный файл, чтобы вы могли инициировать перенаправление. В этом суть. –

0

Возможно использование мультиплексора.

HttpResponse подклассифицирован и позволяет возвращать многостраничные данные.

На стороне клиента вам необходимо получить данные в кусках и проанализировать в соответствии с соответствующим типом Mime.

Вот реализация

https://anentropic.wordpress.com/2010/05/14/jsdjango-streaming-multi-part-ajax-responses-mxhr/

Смежные вопросы