장고(django) 사이트맵 생성 방법

장고로 블로그를 개설하고 있는데 사이트맵은 SEO를 향상시키기 위해서 아주 기본적으로 제출해야 할 필수 요소다. 사이트맵은 봇에게 사이트의 구조를 알려준다. 필자는 장고에서 이 기본적인 사이트맵을 생성하는데 큰 난항을 겪었다. 겪은 이유는 대표적으로

  • 장고의 메인 문서가 영어라는 것
  • 나름대로 고집피워 소스를 정리하려고 했던 것

위 두가지 이유가 있었다. 영어라서 한 50% 정도만 이해하여 막혀도 이렇다 할 해결책을 찾을 수 없었고 한국인이 작성한 글에서도 나름 정갈한 소스를 만들어 보고자 한 오만한 생각이 계기가 되었다. 결론은 그냥 하라는대로 하는게 최선의 방법이었다는 것이다.


하면서 알게 된 것도 있다. reverse라는 기능인데 가령 템플릿에서 포스트의 URL을 알아내려면 자신이 사용하고 있는 파라미터(pk 등… 필자의 경우에는 작성자와 Slug처리된 제목)를 보내줘서 URL을 만들어 줘야 한다. 하지만 이 reverse를 사용하면 아주 간단하게 함수를 통해 링크를 반환해준다. 코드는 아래에서 다룰 예정이다.


1. settings.py

1
2
3
4
5
6
INSTALLED_APPS = [
    ...
    'django.contrib.sites', 
    'django.contrib.sitemaps', 
    ...
]

settings.pyINSTALLED_APPS에서 위 두 항목을 추가하자. 그리고 추가적으로 아래 코드도 넣어줘야 한다.

1
SITE_ID = 1


2. sitemaps.py

이후 sitemaps.py 라는 파일을 자신의 앱 폴더 안에 생성하자.

1
2
3
4
5
6
7
8
9
10
from django.contrib.sitemaps import Sitemap
from .models import Post

class PostSitemap(Sitemap):
    changefreq = 'weekly'
    priority = 0.5
    def items(self):
        return Post.objects.filter(created_date__isnull=False).order_by('created_date')
    def lastmod(self, obj):
        return obj.updated_date

자신이 사이트맵을 만드려는 모델(블로그에선 포스트)을 불러와 위와같은 모양으로 만든다. items는 포스트 목록 불러오듯 만들어주면 되고, lastmod에는 날자가 들어가면 된다. 필자의 경우에는 업데이트 날자를 넣었다. 기존에 사용하는 블로그(이 블로그)에선 생성된 날자를 사용하는데 큰 문제는 없어보인다.


3. models.py

1
2
3
4
5
6
from django.urls import reverse

class Post(models.Model):
    ...
    def get_absolute_url(self):
        return reverse('post_detail', args=[self.author, self.url])

사이트맵을 생성할때 필수적으로 get_absolute_url라는 함수를 참조한다. 여기서 포스트의 url을 생성하여 전달해 주어야 한다. 생성하는 방법은 reverse 뿐만 아니라 다양하게 만들 수 있을 것이다. 어찌되었건 reverse 함수를 사용하면 쉽게 만들 수 있다.

필자의 포스트 링크는 /@baejino/how-to-make-sitemap-in-django와 같이 구성된다. 그래서 위와같이 author와 Slug 처리된 url을 매개변수로 넘겨준다.


4. urls.py

이제 다왔다. 봇이 방문했을때 sitemap을 제공해주자.

1
2
3
4
5
6
7
8
9
10
11
12
from django.contrib.sitemaps.views import sitemap
from .sitemaps import PostSitemap

sitemaps = {
    'posts':PostSitemap,
}

urlpatterns = [
    ...
    path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='sitemap')
    ...
]

자 이제 자신의 서버에서 /sitemap.xml로 접속해보자 사이트맵이 등장할 것이다. 하지만 도메인 주소가 example.com으로 뜰텐데

admin page

admin 페이지로 접근해서 위 사이트들의 변경 버튼을 누르면 도메인 주소를 변경할 수 있다. 끝!

Jino Bae
WRITTEN BY

Jino Bae

웹 개발자 지망생
im@baejino.com

comments powered by Disqus