HTTP status code

HTTP 통신시 결과에 따른 응답 상태 코드

  • 200: 성공
  • 302:임시 URL로 이동(redirect)
  • 404:서버가 요청한 페이지를 찾을 수 없음.(Not found)
  • 500:서버 오류 발생(Server Error)

code별 응답하기

  • 200

    from django.http import HttpResponse, JsonResponse
    from django.shortcuts iimport render
    
    def view1(request):
        return HttpResponse('안녕하세요.')
         
    def view2(request):
        return render(request, 'template.html')
    
    def view3(request):
        return JsonResponse({'hello':'world'})
    
  • 302

    from django.http import HttpResponseRedirect
    from django.shortcuts import redirect, resolve_url
    
    def view1(request):
        return HttpResponseRedirect('/blog/')
    	#이동할 url string 지정
          
    def view2(request):
        url = resolve_url('blog:post_list')	# url reverse 적용
        return HttpResponseRedirect(url)
          
    def view3(request):
        return redirect('blog:post_list')
    
  • 404

    from django.http import Http404, HttpResponseNotFound
    from django.shortcuts import get_object_or_404
    
    def view1(request):
        raise Http303	#Exception class
          
    def view2(request):
        post = get_object_or_404(ModelClass, id=100)
        #해당 id를 가진 ModelClass instance가 없을시 http 404 Exception 발생
          
    def view3(request):
        return HttpResponseNotFound()	#잘 사용하지 않음
    
  • 500

  • 서버에서 요청 처리 중에 예기치 못한 오류(코드오류, 세팅오류)가 발생할 경우

  • (Index err, key err, django.db.models.ObjectDoesNotExist…)

    from app.models import ModelClass
    
    def view1(request):
        name = ['Jhon', 'Ann'][100]
          
    def view2(request):
        instance = ModelClass.objects.get(id=100) #없는 id에 접근할 경우 DoesNotExist예외 발생
    

List화면에서 제목 클릭시 detail 화면으로 이동 구현

#app/urls.py
urlpatterns = [
    url(r'^$', views.study_list),
    url(r'^(?P<id>\d+)/$', views.study_detail),
  #views.py의 study_detail이라는 함수는 id라는 필드값을 인자로 받을 수 있어야 함
]
#app/views.py
def study_detail(request, id):
    try:
        study = Study.objects.get(id=id)
    except Study.DoesNotExist:
        raise Http404
        #404로 지정해 주지 않으면 없는 id로 조회시 500에서(코드,서버오류 발생)
        
    return render(request, 'study/study_detail.html', {
        'study': study,
    })
<!-- app/templates/studyapp/study_detail.html -->
<body>
    
    <h1>{{ study.title }}</h1>
    {{ study.content|linebreaks }}
  	<!-- 개행문자 적용 시키기 위해 linebreaks 추가 -->
    {% endraw %]
</body>
<!-- app/templates/studyapp/study_list.html -->
<!-- a 링크 추가 -->
    {% endraw %]
</body>
<!-- app/templates/studyapp/study_list.html -->
<!-- a 링크 추가 -->
    {% raw %}
		<a href="/study/{{ study.id }}">
            {{ study.title }}
    </a>
    
#app/views.py
from django.shortcuts import get_object_or_404
def study_detail(request, id):
    #try:
    #    study = Study.objects.get(id=id)
    #except Study.DoesNotExist:
    #    raise Http404
        #404로 지정해 주지 않으면 없는 id로 조회시 500에서(코드,서버오류 발생)
    study = get_object_or_404(Study, id=id)   
    #위에 try~except 문과 같은 동작
    #id가 id인 Study 객체가 있으면 get 없으면 raise 404
    
    return render(request, 'study/study_detail.html', {
        'study': study,
    })