장고 404 페이지 설정하기
오늘은 장고(Django)에서 404 에러 페이지를 어떻게 설정할지 고민을 했다. 구글 서치 콘솔에서 더 이상 사용하지 않는 URL을 계속해서 크롤링하지 않도록 하기 위해, 404 페이지를 반환하는 방법을 찾아봤다. 특히, 많은 URL이 더 이상 유효하지 않다 보니 하나씩 설정하는 건 비효율적일 것 같아, 전역적으로 처리할 수 있는 방법이 필요했다.
우선순위: 구글 서치 콘솔 크롤링 문제 해결
구글 서치 콘솔에서 더 이상 사용하지 않는 URL을 크롤링하지 않도록 하려면 404 또는 410 상태 코드를 반환하는 것이 좋다고 한다. 404는 페이지를 찾을 수 없음을 의미하고, 410은 페이지가 아예 삭제되었음을 알리는 코드다. 내가 설정할 페이지는 더 이상 사용하지 않기 때문에 404로 결정했다.
404 설정 방법
우선, 장고에서 특정 URL에 대해 404 상태 코드를 반환하는 방법은 간단했다. HttpResponseNotFound를 사용하면 된다.
from django.http import HttpResponseNotFound
def old_url_view(request):
return HttpResponseNotFound('<h1>Page not found</h1>')
이렇게 작성하고 urls.py에 해당 뷰를 매핑하면 해당 URL에 접근할 때 404 상태 코드를 반환할 수 있다. 하지만 이 방식은 URL이 많을 때는 비효율적이다. 더 좋은 방법은 전역적으로 404를 처리하는 것이다.
모든 유효하지 않은 URL에 404 반환하기
모든 유효하지 않은 URL에 대해 404를 반환하려면, 장고의 기본 404 처리기를 설정하면 된다. 이를 위해 views.py에 커스텀 404 페이지를 만드는 코드를 작성했다.
from django.shortcuts import render
def custom_page_not_found(request, exception):
return render(request, '404.html', status=404)
이 뷰는 404 상태 코드를 반환하면서 404.html 템플릿을 렌더링해준다. 이제 urls.py에서 이 뷰를 404 처리기로 등록하면 된다.
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
# 여기에 다른 URL 패턴들을 추가한다.
]
handler404 = 'myapp.views.custom_page_not_found'
마지막으로, settings.py에서 DEBUG를 False로 설정해야 404 처리가 제대로 동작한다.
DEBUG = False
ALLOWED_HOSTS = ['*'] # 실제 사용 중인 도메인으로 설정해야 한다.
이렇게 설정하니 모든 유효하지 않은 URL에 대해 404 페이지가 반환되도록 쉽게 처리할 수 있었다.
404 페이지 템플릿
단순히 상태 코드만 반환하는 것이 아니라 사용자 친화적인 페이지를 제공하기 위해, 404 페이지에 사용할 템플릿도 만들어봤다. 아래는 간단한 404.html 파일이다.
<!DOCTYPE html>
<html>
<head>
<title>Page not found</title>
</head>
<body>
<h1>Page not found</h1>
<p>The page you are looking for does not exist.</p>
</body>
</html>
결론
오늘 장고에서 404 상태 코드를 반환하는 방법을 설정했고, 구글 서치 콘솔에서 더 이상 유효하지 않은 URL을 크롤링하지 않도록 할 수 있게 되었다. 앞으로도 필요할 때마다 404 설정을 쉽게 할 수 있을 것 같다. SEO 측면에서도 더 깔끔한 결과를 기대해볼 수 있을 것 같다.