Django の render, render_to_response, HttpResponse の違い

render と render_to_response は、いずれも HttpResponse オブジェクトを返すショートカットのラッパーメソッドです。

ポイント
大きな違いは HttpRequset クラスの request オブジェクトをどのように渡すか渡さないかにあります。
 

① 書き方の違い

view.py で動作を比較したいと思います。次の3つのメソッド view_method1 と view_method2, view_method3 は、"だいたい" 同じ動作をします。

render メソッドを使ったほうが可読性が上がりそうですね。

# request を template にいれています。
def view_method1(request):                                                       
  template = loader.get_template('app_name/template_name.html')                  
  context = {                                                                    
    'blog_title' : 'やる夫の日記',                                               
    'content'    : 'ケーキを食べた。'}                                                                              
  return HttpResponse(template.render(
    context,
    request
  ))                          

# request を引数として直接与えています。
def view_method2(request):                                                       
  context = {                                                                    
    'blog_title' : 'やる夫の日記',                                               
    'content'    : 'ケーキを食べた。'}
  return render(                                                                 
    request,                                                                     
    'app_name/template_name.html',                                               
    context                                                                      
  )

# request を与えていません。
def view_method3(request):                                                       
  context = {                                                                    
    'blog_title' : 'やる夫の日記',                                               
    'content'    : 'ケーキを食べた。'}
  return render_to_response(                                                                 
    # render_to_response には request が渡せない...。
    # request, 
    'app_name/template_name.html',                                               
    context                                                                      
  )

② 動作の違い

ひとことで言えば session の情報などが渡せないというところでしょうか。

renderrender_to_response の引数に注目してください。引数に request がありません。そのことからも render_to_response だと session 周りの情報が渡せないことがわかります。基本は render 使うことになりそうですね...。

その昔 render_to_response でも request を context_instance に渡すことができたのですが、もうそれは非推奨のようです。"Deprecated since version 1.8: The context_instance argument is deprecated. Simply use context."

HttpResponse にベタ書きするときは template に request 打ち込んで、render_to_response のときは context に request打ち込むという色んな書き方が昔はあったわけですねー。

# context_instance に request を与えている。
# Django 1.8 から非推奨
def view_method3(request):                                                       
  context = {                                                                    
    'blog_title' : 'やる夫の日記',                                               
    'content'    : 'ケーキを食べた。'}
  return render_to_response(                                                                 
    context_instance = RequestContext(request,context)
    'app_name/template_name.html',                                               
    context                                                                      
  )

③ template.render メソッドの動作

ちなみに template.render メソッドは、純粋に文字列を返しています。何が言いたいかと言いますと、そんなに難しいことはしてないですよ、ということです。

$ python manage.py shell
>>> from django.template import Template
>>> template = Template("My name is {{ my_name }}.")
>>> 
>>> from django.template import Context
>>> context = Context({"my_name": "Adrian"})
>>> template.render(context)
'My name is Adrian.'
>>> 
>>> # template.render(context) は文字列を返す。
>>> 
>>> 
>>> from django.http import HttpResponse
>>> HttpResponse(template.render(context))
<HttpResponse status_code=200, "text/html; charset=utf-8">
>>> 
>>> # 文字列を HttpResponse に渡している。