Python/* Django

8. Http Status Code 404

포꾼 2017. 12. 13. 11:27

HTTP Status Code 


웹서버는 적절한 상태코드로서 응답해야한다.

대표적 HTTP 응답 상태 코드

• 200 : 성공. 서버가 요청을 잘 처리했다. (OK)

• 302 : 임시 URL로 이동했다. (Redirect)

• 404 : 서버가 요청한 페이지를 찾을 수 없음. (Not Found)

• 500 : 서버 오류 발생 (Server Error) 

"GET /blog/ HTTP/1.1" 200 100069

GET : GET방식으로 요청 (GET,POST)

/blog : 어떤 URL

HTTP/1.1 : 프로토콜

200 : 응답 코드

100069 : 응답 사이즈


200응답 예제

from django.http import HttpResponse, JsonResponse

from django.shortcuts import 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로 이동


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 Http404 # Exception Class


def view2(request):

post = get_object_or_404(Post, id=100) # 없는 id에 접근할 경우 Http404 예외 발생 


def view3(request):

return HttpResponseNotFound() # 잘 쓰지 않는 방법 


500응답 예제

 # 이는 서버에서 요청 처리 중에 예기치못한 오류 (코드오류, 설정오류) 가 발생할 경우

IndexError, KeyError, django.db.models.ObjectDoesNotExist, ... 등


from blog.models import Post


def view1(request):

name = ['Tom', 'Steve'][100]


def view2(request):

post = Post.objects.get(id=100) # # 없는 id에 접근할 경우 Post.DoesNotExist예외가 발생

# blog/views.py

def post_list(requests):


    1/0   ## 500에러 발생 시킬 코드 삽입


"GET /blog/ HTTP/1.1" 500 74141


지정 Record가 없는 것은 서버오류가 아니다. (!= 500)

이는 명확히 404 응답으로 처리

from blog.models import Post


def view1(request, id):

try:

post = Post.objects.get(id=id)

except (Post.DoesNotExist, Post.MultipleObjectsReturned):

raise Http404


def view2(request, id):

try:

post = Post.objects.filter(id=id)[0]

except IndexError:

raise Http404 

>  Post.objects.filter(id=252).delete() # id가 252인 게시글을 삭제


DoesNotExist at /blog/252/ 500 에러 발생 # 레코드가 없는것은 500에러가 아니라, 404로 처리하여야한다.

def post_detail(request, id):

    #try:

    #    post = Post.objects.get(id=id)

    #except Post.DoesNotExist:

    #    raise Http404


    post = get_object_or_404(Post, id=id)


    return render(request, 'blog/post_detail.html',{

        'post':post,

    })


get_object_or_44를 사용하면 쿼리셋의 인자를 그대로 쓸 수 있다.

from django.shortcuts import get_object_or_404

def view1(request, id):

post = get_object_or_404(Post, id=id) # 추천




"""본 내용은 AskDjango VOD, "장고 차근차근 시작하기" 강의내용을 참고하여 작성했습니다.(https://nomade.kr/)"""

반응형