출처: https://meyouus.tistory.com/64 [정보 공유 - For Me For You For Us]
본문으로 바로가기

Django 공부를 하다보면 다음과 같은 예시의 코드들을 쓰는 경우가 있을 것이다:

return redirect('login')
...
return render(request, 'accounts/register.html', {'foo': 'bar'})

여기서 의문이 드는 것은, redirect와 render의 차이점은 무엇인가??

 

redirect는 간단하게 말해, 지금 내가 있는 페이지에서, 지정한 페이지로 redirect, 다시 지정을 해주는 것이다. 아예 사용자를 그 특정 페이지로 옮긴다고 보면 된다. 302 status code를 불러 일으킨다 (단순히 그 url을 불러일으킬때 나오는 상태 메세지다.) redirect는 HttpResponseRedirect를 불러일으키면서, 페이지의 상단 url이 가고자하는 대상 template의 url로 바뀌는 것을 볼 수 있다. 따라서 이는 POST나 form을 통과시킨 뒤에 아예 새로운 페이지로 옮기려고 할 때 사용하는 방식으로 인지하면 된다.

 

render은 반면,  template과 context dictionary를 합쳐서 HttpResponse를 불러일으킨다고 생각하면 된다. 즉, 특정 template을 불러오기만 한다고 생각하면 된다. 이를 할 경우, redirect와는 다르게 페이지의 상단 url이 가고자하는 대상 template의 url로 바뀌지 않는 것을 볼 수 있다. 또한, 이를 이용해 POST나 form을 통과시킨 후 사용하게 된다면, 나중에 큰 문제가 생길 수 있는데, 예를 들어보자:

def loginPage(request):
	if request.method == 'POST':
		username = request.POST.get('username')
		password = request.POST.get('password')
		user = authenticate(request, username=username, password=password)
		if user is not None:
			login(request, user)
			return redirect('home')
		else:
			messages.info(request, 'Username OR Password is Incorrect')
	context = {}
	return render(request, 'accounts/login.html', context)

간단한 로그인을 구사하는 Django 코드이다. 만약 여기서 reutrn redirect('home')이 아닌 return render(request, 'account/home.html')을 할 경우, 똑같이 home.html로 화면은 이동한다. 하지만 여기서 refresh(새로고침)을 할 경우, 다시 form을 제출해야하는 경우가 발생할 수 있다. 또한, 새로고침 하기전에 페이지 상단 url을 보면 '.../login/' 이런식으로 되어 있는 것을 볼 수 있다. 우리는 그것을 원하는 것이 아니라 아예 로그인 된 페이지를 원하기 때문에 이런 상황에서는 render이 아닌 redirect를 쓰는 것이 적절한 방법이다.