티스토리 뷰

1. HttpResponse VS HttpResponseRedirect

HttpResponse

HttpResponse()

: HttpResponse 객체를 반환

  • HTTP코드가 200이고 생성자로 전달된 컨텐츠를 포함한 HttpResponse 객체 생성
  • 보통 작은 response에서만 사용 (ajax로 받은 데이터나, 작은 number 등)
from django.http import HttpResponse

def index(request):
    return HttpResponse("What do you do in your free time?")

 

HttpResponseRedirect

HttpResponseRedirect()

: 주어진 url로 redirection

  • HTTP코드가 302(Found/Moved temporarily)인 HttpResponse 객체 생성
  • 다른 페이지로 redirect할 때 사용 ex) form POST전송 성공 이후
from django.http import HttpResponseRedirect

def index(request):
    return HttpResponseRedirect('/index/')

 

2. render VS redirect

아래 두 함수는 Django에서 제공하는 shortcuts 함수이다.

render

render(request, template_name, context=None, content_type=None, status=None, using=None)

: 주어진 template을 context와 결합하고 rendering된 HttpResponse 객체를 반환

  • template 파일이 view에서 넘긴 데이터로 표현되어짐

원래 template에 context를 전달하려면 다음과 같이 template파일을 따로 불러와야 했다.

from django.http import HttpResponse
from django.template import loader


def index(request):
    template = loader.get_template('index.html')
    context = {
        'question': 'What do you do in your free time?',
    }
    return HttpResponse(template.render(context, request))

그러나 render() 를 사용하면 다음과 같이 훨씬 간단하게 표현된다.

from django.shortcuts import render

def index(request):
    return render(request, 'index.html', {'question': 'What do you do in your free time?',})

 

redirect

redirect(to, args, permanent=False, kwargs)

: 전달받은 URL로 HttpResponseRedirect를 반환. 즉, 해당 URL로 이동

  • 이동하는 페이지에 데이터는 전달할 수 없음
  • 인자로 사용되는 URL은 절대 URL, 상대 URL 모두 가능
  • 보통 urls.py에서 정의한 각 url pattern들의 name을 활용하여 사용

원래 url name을 사용하여 url을 재구성하려면 다음과 같이 reverse 함수를 따로 불러와야 했다.

from django.http import HttpResponseRedirect

def index(request):
    return HttpResponseRedirect(reverse('blog:detail', args=[1]))
    return HttpResponseRedirect(reverse('blog:detail', kwargs={'id':1}))

그러나 redirect를 사용하면 좀 더 간단하게 표현할 수 있다.

from django.shortcuts import redirect

return redirect('blog:detail', 1)    #내부적으로 resolve_url() 사용

return redirect('/blog/detail/1/')    #상대 url
return redirect('http://example.com/blog/detail/1')    #절대 url

 


 

참고 자료

 

첫 번째 장고 앱 작성하기, part 3 | Django 문서 | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

 

[Django] HttpResponse VS HttpResponseRedirect

의문 redirect reverse redirect(reverse(‘password-set’)) return HttpResponseRedirect(reverse(‘news-year-archive’, args=(year,))) render render_to_response 차이가 뭐지 redirect(‘welc…

milooy.wordpress.com

 

댓글