2012-05-01 13 views
1

簡単な方法はありますか?Django HttpResponse - ファイルと内容の応答

ビューでリクエストを取得した後、 ファイルとページの再レンダリングされたテンプレートをユーザーに返しますか?

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,}) 
これは私がファイルに応答を返す方法ですファイルをREPONSEを「マージ」と

をrender_to_responseよう 何か

(私はコピー&ペーストして、いくつかの重要な行を落としているかもしれませんが、私のポイントを作るために - このコードは動作しますが、問題は、これら2つのコードサンプルではありません)

質問は:どのように私はそれらを一緒に "マージ"するのですか? django標準機能でこれを行う簡単な方法はありますか? これにはAjaxを使用する必要がありますか?あなたはハイパーテキスト転送プロトコル、ユーザーが対話する方法の表示を簡略化する場合

おかげで、

+1

です。これはどのように機能しますか? –

+0

同じ回答内に2つのコンテンツがありますか?簡単な方法はありません。あなたはおそらくAjaxに行くべきです。 –

+0

ダニエル - 私は一度に2つのジョブを実行したい - ページにボタンを持っている - ユーザーにファイルを送信し、新しいデータでページの "div"セクションを更新します。おそらく私がここで提案していたもの(2回のリクエストを一度に使用する)は解決策ではありませんが、適切なユーザーエクスペリエンスを得るための考え方は歓迎されます – nivniv

答えて

5

(、それは望ましいですなしでこれを行う方法がありますので、もし私が...アヤックスに慣れていませんよ)アプリケーションが応答を提供する要求を送信することです。セクション4.2 of RFC 6266では、「添付ファイル」の処理タイプに一致する応答を返すときに、ユーザーのクライアントに「通常の処理ではなくローカルで応答を保存するようにユーザーに指示する」ことを指示する必要があります。

HTMLやその他のコンテンツタイプを含む応答を提供することはできません。また、クライアントにメッセージを保存して表示するように指示することはできません。それがサポートされていないという事実は、そのようなユーザーエクスペリエンスを提供するための代替手段を模索するべきではないという意味ではありませんが、私たちはそれを練習していないと考え、ユーザーはそれを期待しません。

しかし、実際にそれをやりたければ、ファイルを提供して新しいHTML文書を表示することは、2つの別々の要求/応答コンテキストを取ることを理解する必要があります。最も簡単な設計には、ユーザーがファイルを取得する要求を開始するページも含まれます。ユーザーが完了したファイルを取得したときに通知されるアプリケーションにサブスクライブしてから、新しいコンテンツを表示するか、新しいページ。

+0

うわー、この素晴らしい返信をありがとう!私はそれに少なくとも2回答える必要があると思った。あなたはdjangoの3番目の段落で述べたことをどのように実装しますか? – nivniv

+1

基本的な設計では、ユーザーのクライアントがファイルをダウンロードする別のリクエストを開始する最初のランディングページのリクエストを受け取ると、ランディングページのレスポンスにURLを用意して提供し、特定のユーザーがその特定のファイルをいつダウンロードしたかを識別するために、そのURLをポーリングまたはサブスクライブするためにサイドJavaScriptを使用して、リダイレクトを開始することができます。それがその要点です。 –

0

マルチパートを使用することは可能です。

HttpResponseはサブクラス化され、マルチパートデータを返すことができます。

クライアント側では、データをチャンクで受信し、適切なMimeタイプに従って解析する必要があります。

は、ここでは、ユーザーはここに来る/見たいものを私は想像できない実装

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

関連する問題