BLOG
웹 개발

Django 내부에서 Sitemap 도구를 이용해 Sitemap.xml 생성하기


Nov. 8, 2021, 10:59 p.m.



사이트를 만든다음 네이버 서치 어드바이저나 구글 서치 콘솔과 같은 곳에 등록을 하게 되는데요, 이때 사이트맵을 등록해주면 검색엔진측에서 사이트의 링크들을 더욱 쉽게 색인 할 수 있습니다. 사이트맵을 만드는 방법도 여러가지가 있는데요, 이번 포스트에서는 Django의 자체 기능을 이용해 사이트맵을 생성하는 방법을 알아보겠습니다.

1. 모델 준비하기


사이트맵은 모델 기반으로 만들어집니다. CBV로 개발할 때 각 페이지가 Django의 ListView나 DetailView로 이루어져있다면 쉽게 이를 바탕으로 사이트맵을 생성할 수 있습니다.

예를 들어 블로그 사이트를 만든다면 아래와 같이 Post 모델을 생성할 수 있겠네요.

class Post(models.Model):
  title = models.CharField(max_length=100)
  content = models.CharField()

  created_at = models.DateTimeField(auto_now_add=True)
  updated_at = models.DateTimeField(auto_now=True)

  def get_absolute_url(self):
    return f'/blog/{self.pk}/'

여기서 중요한것은 get_absolute_url() 메서드 입니다. Django에서는 모델의 링크를 얻어올 때 get_absolute_url() 함수를 사용할 것을 권장하고 있습니다. 이는 장고의 여러 기능에서 쉽게 응용하기 위해서인데요, 사이트맵을 생성할 때도 이 메서드를 사용합니다.

get_absolute_url()이 포함된 모델을 만들었다면 다음으로 넘어가겠습니다.

2. Views.py 변경하기


Post 모델이 사용되는 앱의 Views.py에 들어가서 아래와 같은 클래스를 추가해줍니다.

-views.py-
from .models import Post
from django.contrib.sitemaps import Sitemap
...
class BlogSitemap(Sitemap):
  changefreq = "monthly"
  priority = 0.5

  def items(self):
    return Post.objects.all()

이때 changefreq와 priority는 재량껏 설정해 주시면 됩니다. 수정하지 않아도 무방합니다.

3. urls.py 수정하기


마지막으로 example.com/sitemap.xml에 접속했을 때 사이트맵이 출력되도록 urls.py를 수정하겠습니다.

아래의 내용을 루트 디렉터리를 설정하는 urls.py에 추가해주세요.

-urls.py-

from django.contrib.sitemaps.views import sitemap
from blog.views import BlogSitemap
...
sitemaps = {'blog': BlogSitemap}
...
urlpatterns = [
    ...
    path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),
    ...
]           

이전에 만들어준 사이트맵 클래스를 import 해주고 sitemaps 딕셔너리를 만듭니다. 이때 여러 모델의 사이트맵 클래스를 만들었다면 이 딕셔너리에 더 추가해주면 됩니다.

urlpatterns에 path()를 이용해 sitemap.xml에 접속하면 사이트맵이 나오도록 설정해줍니다.

설정이 완료되었다면 서버를 실행하고 접속해보세요.

이런식으로 xml 파일이 출력되면 완성입니다!

Django Sitemap



Search