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를 쓰는 것이 적절한 방법이다.
'Django 공부하기' 카테고리의 다른 글
<Django 공부하기> 회원탈퇴 구현하기 (1) - 단순 회원탈퇴 (No Password Needed) (0) | 2020.11.12 |
---|---|
<Django 공부하기> Forgot ID? 구현하기 (0) | 2020.11.10 |
<Django 공부하기> forms.py란 무엇인가?? Form이란 무엇인가? (0) | 2020.11.09 |
<Django 공부하기> virtualenv를 통해 Django를 사용하기 (0) | 2020.11.09 |
<Django 공부하기> null=True와 blank=True의 차이점은?? (0) | 2020.11.07 |