적절한 HTTP 상태코드로 응답하기

guava·2021년 12월 10일
0
post-custom-banner

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 강의를 듣고 정리한 글입니다.

HTTP 상태코드

대표적인 상태코드

200번대: 성공
300번대: 요청을 마차기 위해 추가 조치가 필요하다.
400번대: 클라이언트측 오류 (잘못된 요청)
500번대: 서버측 오류

상태 코드설명
200서버가 요청을 잘 처리했다. (OK)
201작성됨. 서버가 요청을 접수, 새 리소스를 작성
301영구 이동. 요청한 페이지가 새 위치로 영구적으로 이동했다.
302임시 이동. 페이지가 현재 다른 위치에서 요청에 응답하고 있지만, 요청자는 향후 원래 위치를 계속 사용해야 한다.
400잘못된 요청
401권한 없음. 인증이 필요하다.
403(Forbidden)유저가 인증을 했지만 필요한 권한을 가지고 있지 않아서 요청을 거부
404서버에서 요청한 리소스를 찾을 수 없다.
405허용되지 않는 방법. POST 방식만을 지원하는 뷰에 GET 요청을 하는 경우
500서버 내부 오류 발생

응답 예시

200 응답

from django.http import HttpResponse, JsonResponse
from django.shortcuts import render

# HttpResponse 성공 응답
def view1(request):
    return HttpResponse('Hello, Ask Company')

# render를 이용한 HttpResponse 성공 응답
def view2(request):
    return render(request, 'template.html')

# jsonResponse 성공 응답
def view3(request):
    return HttpResponse('Hello, Ask Company')

302 응답

from django.http import HttpResponseRedirect
from django.shortcuts import redirect, resolve_url

# 비 추천 방법
# HttpResponseRedirect를 직접 사용할 일은 적다.
# resolve_url함수로 URL Reverse를 활용하였다.
def view2(request):
    url = resolve_url('shop:item_list')
    return HttpResponseRedirect(url)

# 추천 방법
def view3(request):
    # 내부적으로 resolve_url을 사용한다.
    # 인자로 지정된 문자열이 url reverse에 실패할 경우, 그 문자열을 그대로 URL로 사용하여 redirect 시도
    return redirect('shop:item_list')

404 응답

# 방법1 - 예외처리를 통해 오류 발생 시 404 응답
def view1(request):
    try:
        item = Item.objects.get(pk=100)
    except Item.DeosNotExist:
        raise Http404
    # 생략
    
# 방법2 - 방법1과 같은 로직. 내부적으로 방법1처럼 raise Http404 활용
def view2(request):
    item = get_object_or_404(Item, pk=100)
    # 생략

500 응답

  • 서버에서 미처 잡지 못한 오류가 발생하였을 때 발생.
  • IndexError, KeyError, django.db.models.ObjectDoesNotExist
  • 모든 예외를 잡아서 통과시키는 것은 안티패턴이다. 중요한것은 에러를 발생시키지 않는게 아니라, 관리하는 것이다. 예기치 못한 에러는 500 응답을 주는게 당연하다.
post-custom-banner

0개의 댓글