[django] render, redirect

EMMA·2022년 7월 18일
0

render와 redirect는 의외로 헷갈린다.

django, 특히 DRF 를 조금씩 연습해보면서 renderredirect를 번갈아 (?) 사용할 일이 잦아졌다.

처음에는 얼핏 비슷해 보이나 받는 인자라던가, 반환하는 내용 등이 달라 당연히 사용 목적도 다르다.

render는 template을 호출한다

나는 그동안 django를 철저하게 backend 용으로 사용해 왔기 때문에, html template을 사용할 일이 없었다. 하지만 template을 사용하게 되면 template을 띄우는 역할을 할 render를 반드시 사용하게 된다.

한 마디로 renderloader()HttpResponse()를 합친 개념.

render(request, template_name, context=None, content_type=None, status=None, using=None)
  • request: 요청을 response하기 위해 받는 필수 인자
  • template_name : template full name, 필수 인자
  • context : view에서 사용한 변수를 html로 넘기는 역할, 즉 template에서 쓰이는 변수명과 파이썬 객체를 연결. key:value 의 dict 형태로 담아야 한다
    • key: template에서 사용할 변수명
    • value: 파이썬 변수명
  • content_type: 타입 정의, text/html 가 default다
  • status : status code, 200이 default
  • using : 템플릿 엔진 사용을 위한 이름 정의

사용 예시는 아래와 같다.
내가 좀 더 이해하기 쉬우려고 공식문서의 예시를 약간 짬뽕시켰다.

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는 url을 호출한다

반면 redirectrender에 비해 간단하다.

redirect(to, *args, permanent=False, **kwargs)
  • to: 이동할 url 지정
  • permanent : temporary redirect로 설정하는 것이 deafult
    • temporary redirect: 일시적인 redirect
    • permanent redirect: 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 등을 띄우는 함수이나, redirectrender와 달리 context등을 넘기지는 못한다.

  • render: 지정한 template을 띄움과 동시에 template에서 매핑한 파이썬 변수를 사용할 수 있는 함수
  • redirect: 지정한 url로 이동시키는 함수


참고 자료
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/

profile
예비 개발자의 기술 블로그 | explore, explore and explore

0개의 댓글