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 の情報などが渡せないというところでしょうか。
render
と render_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 に渡している。