【Django】render / redirect / HttpResponseなどの違い

Django

Djangoの関数ベースビューでよく見かける
render / redirect / HttpResponse の3つ。

公式サイトに沿って、それぞれ3つを理解し、
自分なりに噛み砕いた説明をしていきます。

それぞれの違いを比較

3つそれぞれの違いを簡単に説明。

  • HttpResponse
     文字列の情報を渡す、ファイルを表示、ダウンロードなど様々なことができる。
     テンプレート(HTML)の表示もできるが、手間がかかるため、不向き。
     下記のrenderはこれのショートカット関数。
  • render
     関数ベースビューで一番多用される。
     テンプレート単体や文字列を反映したテンプレートを簡単に表示できる。
     ファイルの表示などには不向き。
  • redirect
     webページに来たユーザを別のURLに転送する。
     サイトの表示用ではない。

HttpResponseの使い方

主な機能として4つあります。
これらは全て公式サイトを参照しています。

文字列をWebページに引き渡す

よく使われる機能。

HttpResponse() の中に文字列を入れて、Webページに表示させる。

def sample(request):
    return HttpResponse("Hello, World!")

イテレータを引き渡す

イテレータがややこしいですが、簡単に言うとデータの集団に対し
順番にアクセスしていくためのオブジェクト。
そのオブジェクトをwebページに渡す機能。
イテレータに関してはこちらのサイトが分かりやすかったです。

この機能はあまりHttpResponseを使用して使わない。

ヘッダーフィールドを設定する

これはあまり使わない。

サイト訪問時、画面には出ないが、訪問情報として
持っているヘッダーフィールドを設定・変更できる。

例を書きます。辞書型でヘッダーフィールドを設定します。

response = HttpResponse()
response['Pragma'] = 'no-cache'

ファイルをブラウザーで表示できる

pdfやcsv、エクセル、pngなどの複数の形式の中から
選択した形式でデータを表示できる。

content-type = ‘***’の形で選択します。
***の部分と形式の種類はここを参考にするといいです。

#csvをダウンロードさせる場合
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment;  filename="somefilename.csv"'
return response

#エクセルをダウンロードさせる場合
response = HttpResponse(my_data, content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment; filename="somefilename.xls"'
return response

renderの使い方

関数ベースビューならこれを多用する。
HttpResponseの特定の機能を盛り込んだショートカット関数です。

HttpResponseではテンプレートを表示する際に
Django.templateモジュールのloaderなどを
引っ張ってくる必要がありますが、

renderでは第2引数でテンプレートを表示でき
第3引数で文字列などのデータを渡すことができます。

def sample(request):
    context = {'sample':'この文字を引き渡す'}
    return render(request, sample.html, context)

公式サイトの render はこちらです。

redirectの使い方

読み方通りのリダイレクトであり
Webページに来たユーザを別のURLに転送する。

例えば
フォーム入力が完了した際に元のページに戻る際に使われたり
今までのURLを残したまま、リニューアルしたURLへ転送する時に使われる。
(URLでお気に入り登録したユーザなどが混乱しないように)

redirectには3つの特徴があります。

  • 転送先は、絶対URLか相対URL、urls.pyのview名で設定できる
def rel(request):
    return redirect('/some/url/') #相対URL

def abs(request):
    return redirect('https://example.com/') #直接URL

def name(request):
    return redirect('viewname') #view名
  • view名で設定した場合、引数も付属してリダイレクトすることができる
def name(request):
    ...
    return redirect('viewname', hoge='hoge')
  • モデルのidやuuidを使ったURLを使いたい場合
    models.pyのget_absolute_url()にも対応している

以上です。公式サイトはこちらです。

まとめ

関数ベースビューでは、主に”render”を使用し
ファイルを表示するなどの場合は”HttpResponse”を使います。
”redirect”は転送したい場合になります。

ざっくりこの3行だけ覚えておけばどうにかなるかと。

タイトルとURLをコピーしました