Sitemap是為了方便搜索引擎識別網(wǎng)站上有哪些內(nèi)容可供抓取的一個網(wǎng)頁。最簡單的的sitemap形式是XML文件,文件中會包含諸如網(wǎng)站上指定內(nèi)容的網(wǎng)址以及其他相關(guān)的元數(shù)據(jù)(比如上次更新時間、內(nèi)容更改的頻率以及對應(yīng)內(nèi)容在網(wǎng)站自身的權(quán)重等等),這些可以方便搜索引擎更為智能地、有目的性地抓取我們網(wǎng)站的內(nèi)容。
那么這個sitemap是怎么來的呢?如何為自己的網(wǎng)站添加sitemap呢?兄弟們別慌,對于Django這種非常成熟框架來說,很顯然,這種功能肯定是內(nèi)置的啦,是不是很開心?反正對我這種小白來說是很開心的,下面我們就來看看(我這種小白是如何被虐的)如何使用Django的內(nèi)置sitemap。
安裝
看到官方文檔sitemap頁面前幾行的時候我就笑了,感覺so easy,媽媽再也不用擔(dān)心我的站點沒有sitemap了。
跟django的其他應(yīng)用一毛一樣,sitemap安裝非常簡單,咱們跟著官方文檔來哈:
到settings.py文件中去添加'django.contrib.sitemaps'到INSTALLED_APPS;
確認一下在setting.py中的TEMPLATES下的APP_DIRS是否為True(已知Django 2.1是默認為True的);
確認一下已經(jīng)安裝了sites framework。看到這里不禁扶額,這是啥?我是誰?我在哪?……只能順手擠按了一下睛明穴,不慌不慌,我們點進去看看這是個啥:
官方文檔:Django comes with an optional “sites” framework. It’s a hook for associating objects and functionality to particular websites, and it’s a holding place for the domain names and “verbose” names of your Django-powered sites.
我的理解:這玩意是個鉤子,連接objects和functionality的鉤子;同時又是網(wǎng)站域名信息的存放地;大概就是這樣吧;
既然sitemap需要這玩意,那就裝吧,找到sites framework的Enabling the site framework,嘿嘿嘿,也非常簡單,三步走戰(zhàn)略:
添加'django.contrib.sites'到 INSTALLED_APPS(基本操作嘛);
在setting.py中設(shè)置SITE_ID: SITE_ID = 1;
Run migrate;(這里埋了個小坑,因為在migrate以后django.contrib.sites通過post_migrate創(chuàng)建并存儲的網(wǎng)站的域名是example.com,而官方文檔給出的如果想要設(shè)置正確的域名信息的話請用data migration,這里先按下不表,因為我當(dāng)時就是這樣沒管它……)
好,通過以上三步,成功enable了site framework,那么前面說的sitemap安裝的那三步也剛好完成了, Exciting!接下來就是設(shè)置sitemap的訪問地址了(都這個套路嘛對吧)。
配置URL
我前前后后仔細閱讀了兩遍官方文檔的介紹sitemap內(nèi)容,發(fā)現(xiàn)django在這方面給出的可定制化內(nèi)容還是挺多的,但是像我這種小白,或者說是對于簡單的站點來說,其實沒必要整的太復(fù)雜,請直接拿最簡單的方式砸我臉上,是的,良心django再次提供了shortcuts——class GenericSitemap:
比如說你想把blog的所有Post列入到sitemap中以方便搜索引擎匹配,那么在urls.py中增加如下內(nèi)容:
from django.contrib.sitemaps import GenericSitemap
from django.contrib.sitemaps.views import sitemap
from django.urls import path
from blog.models import Post
info_dict = {
'queryset': Post.objects.all(),
'date_field': 'pub_date',}
Sitemaps = {'blog': GenericSitemap(info_dict, priority=0.6)}
urlpatterns = [
# the sitemap
path('sitemap.xml', sitemap,
{'sitemaps': sitemaps},
name='django.contrib.sitemaps.views.sitemap'),]
這時候訪問你的域名/sitemap.xml即可看到django為你生成的sitemap文件了。也正是在這個時候前面埋的那個小坑出現(xiàn)了,你會發(fā)現(xiàn)sitemap中的域名怎么都成了example.com呢(在搜索該問題過程中發(fā)現(xiàn)有的同學(xué)會是localhost.com,可能是django版本不同吧)。這樣的sitemap有個卵用哦……
沒辦法,我就回到site framework那里,硬著頭皮再去看如何用data migration來設(shè)置正確的域名信息,因為官方文檔就是這么說的:
django.contrib.sitesregisters apost_migratesignal handler which creates a default site namedexample.comwith the domainexample.com. This site will also be created after Django creates the test database. To set the correct name and domain for your project, you can use a data migration.
結(jié)果看了半天,data migration的基本內(nèi)容是明白了,但是還是沒搞懂怎么通過它來設(shè)置域名信息(是小白沒錯了)。
于是放棄了,直接祭出Google大法,搜了一通發(fā)現(xiàn)原來如此,原來如此啊……
其實說白了,之所以生成的sitemap里的域名為example.com就是因為數(shù)據(jù)庫里就是這個保存的,而這又是因為site framework那一步migrate在初始化的時候就是這么給數(shù)據(jù)庫傳遞的默認值。既然想改這個值,無非就是去數(shù)據(jù)庫里改數(shù)據(jù)罷了,那么改數(shù)據(jù)庫內(nèi)容最簡單的方法是啥呢?當(dāng)然是admin頁面啦。想到這里,我直接訪問/admin頁面,登陸超級用戶后發(fā)現(xiàn),阿西吧,連自己去把對應(yīng)內(nèi)容注冊到admin都省了,人家直接給你admin里已經(jīng)默認顯示在那了,跟默認的那個“用戶USER”和“組GROUP”一樣。
你要做的只是點開修改,把example.com改成你自己的域名即可。然后你再去看/sitemap.xml生成的已經(jīng)是你要的域名了。
P.S. 我這里admin是中文界面是因為在settings.py中把language改成“zh_hans”了
至此,簡單的Django sitemap生成就完成了,剩下的就是把你的sitemap提交給Google大大和Baidu小小了。這里說的只是比較簡單的方法,如果你想實現(xiàn)一些復(fù)雜的sitemap,還是建議去啃一遍官方文檔,雖然啃的慢,但是啃完了才會發(fā)現(xiàn),真香!