티스토리 뷰

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/)"""

반응형

'Python > * Django' 카테고리의 다른 글

10. Django 템플릿 상속  (0) 2017.12.13
9. Model Relationship Fields  (2) 2017.12.13
7. 모델을 통한 데이터 CRUD  (0) 2017.12.12
6. Django Admin  (0) 2017.12.12
5. Migration  (0) 2017.12.12
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함