Django站點Sitemap生成及修改默認域名信息

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安裝非常簡單,咱們跟著官方文檔來哈:

  1. 到settings.py文件中去添加'django.contrib.sitemaps'到INSTALLED_APPS;

  2. 確認一下在setting.py中的TEMPLATES下的APP_DIRS是否為True(已知Django 2.1是默認為True的);

  3. 確認一下已經(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)略:

  1. 添加'django.contrib.sites'到 INSTALLED_APPS(基本操作嘛);

  2. 在setting.py中設(shè)置SITE_ID: SITE_ID = 1;

  3. 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.sites registers a post_migrate signal handler which creates a default site named example.com with the domain example.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”一樣。

admin頁面的站點修改界面

你要做的只是點開修改,把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),真香!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容