django, 특히 DRF 를 조금씩 연습해보면서 render
와 redirect
를 번갈아 (?) 사용할 일이 잦아졌다.
처음에는 얼핏 비슷해 보이나 받는 인자라던가, 반환하는 내용 등이 달라 당연히 사용 목적도 다르다.
나는 그동안 django를 철저하게 backend 용으로 사용해 왔기 때문에, html template을 사용할 일이 없었다. 하지만 template을 사용하게 되면 template을 띄우는 역할을 할 render
를 반드시 사용하게 된다.
한 마디로 render
는 loader()
와 HttpResponse()
를 합친 개념.
render(request, template_name, context=None, content_type=None, status=None, using=None)
key:value
의 dict 형태로 담아야 한다 text/html
가 default다사용 예시는 아래와 같다.
내가 좀 더 이해하기 쉬우려고 공식문서의 예시를 약간 짬뽕시켰다.
from django.shortcuts import render
def my_view(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
return render(request, 'myapp/index.html', {'lastest_question_list': latest_question_list})
#위 예시는 아래와 같다
from django.http import HttpResponse
from django.template import loader
def my_view(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
t = loader.get_template('myapp/index.html')
q = {'latest_question_list': latest_question_list}
#html템플릿을 담은 t를 렌더링하는데, 이 때 context를 담은 c를 인자로 넘겨준다
return HttpResponse(t.render(q, request))
반면 redirect
는 render
에 비해 간단하다.
redirect(to, *args, permanent=False, **kwargs)
permanent=True
로 설정하면, to
로 완전히 옮겨졌다는 의미사용 예시는 아래와 같다.
from django.shortcuts import redirect
def my_view(request):
...
return redirect('https://example.com/')
이번에 django - Todo 만들기를 하면서, 이 부분을 직접 사용해볼 기회가 있었다.
코드는 아래와 같고, 선택된 Todo 객체를 찾아, html로 전달하도록 작성됐다.
#todo.html
<html>
<body>
...
<div class = "body">
<h5>{{ todo.title }}</h5>
<p>{{ todo.description }}</p>
</div>
</body>
</html>
#views.py
from django.shortcuts import render
from .models import Todo
def todo_detail(request, pk):
todo = Todo.objects.get(id=pk)
#주어진 pk를 id로 갖는 Todo 객체를 찾아, todo.html 로 전달한다
return render(request, 'todo.html', {'todo':todo})
그리고 redirect
의 경우에, 내부적으로 get_absolute_url()
, reverse()
등을 호출해서 작동하는데 이 내용은 다음 기회에.
render
, redirect
모두 template/url 등을 띄우는 함수이나, redirect
는 render
와 달리 context등을 넘기지는 못한다.
참고 자료
https://docs.djangoproject.com/ko/4.0/topics/http/shortcuts/#django.shortcuts.render
https://docs.djangoproject.com/ko/4.0/topics/http/shortcuts/#redirect
https://developer.mozilla.org/ko/docs/Web/HTTP/Status/307
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/308
https://perfectacle.github.io/2017/10/16/http-status-code-307-vs-308/