在Django中使用Sitemap的方法講解

來源:互聯網
上載者:User
sitemap 是你伺服器上的一個XML檔案,它告訴搜尋引擎你的頁面的更新頻率和某些頁面相對於其它頁面的重要性。 這個資訊會協助搜尋引擎索引你的網站。

例如,這是 Django 網站(http://www.djangoproject.com/sitemap.xml)sitemap的一部分:

<?xml version="1.0" encoding="UTF-8"?>   http://www.djangoproject.com/documentation/  weekly  0.5    http://www.djangoproject.com/documentation/0_90/  never  0.1  ...

需要瞭解更多有關 sitemaps 的資訊, 請參見 http://www.sitemaps.org/.

Django sitemap 架構允許你用 Python 代碼來表述這些資訊,從而自動建立這個XML檔案。 要建立一個網站地圖,你只需要寫一個`` Sitemap`` 類,並且在URLconf中指向它。
安裝

要安裝 sitemap 應用程式, 按下面的步驟進行:

  • 將 'django.contrib.sitemaps' 添加到您的 INSTALLED_APPS 設定中.
  • 確保 'django.template.loaders.app_directories.load_template_source' 在您的 TEMPLATE_LOADERS 設定中。 預設情況下它在那裡, 所以, 如果你已經改變了那個設定的話, 只需要改回來即可。
  • 確定您已經安裝了 sites 架構.

Note

sitemap 應用程式沒有安裝任何資料庫表. 它需要加入到 INSTALLED_APPS 中的唯一原因是: 這樣 load_template_source 模板載入器可以找到預設的模板. The only reason it needs to go into INSTALLED_APPS is so the load_template_source template loader can find the default templates.
Initialization

要在您的Django網站中啟用sitemap產生, 請在您的 URLconf 中添加這一行:

(r'^sitemap\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps})

This line tells Django to build a sitemap when a client accesses /sitemap.xml . Note that the dot character in sitemap.xml is escaped with a backslash, because dots have a special meaning in regular expressions.

sitemap檔案的名字無關緊要,但是它在伺服器上的位置卻很重要。 搜尋引擎只索引你的sitemap中當前URL層級及其以下層級的連結。 用一個執行個體來說,如果 sitemap.xml 位於你的根目錄,那麼它將引用任何的URL。 然而,如果你的sitemap位於 /content/sitemap.xml ,那麼它只引用以 /content/ 打頭的URL。

sitemap視圖需要一個額外的必須的參數: {'sitemaps': sitemaps} . sitemaps should be a dictionary that maps a short section label (e.g., blog or news ) to its Sitemap class (e.g., BlogSitemap or NewsSitemap ). It may also map to an instance of a Sitemap class (e.g., BlogSitemap(some_var) ).
Sitemap 類

Sitemap 類展示了一個進入地圖網站簡單的Python類片斷.例如,一個 Sitemap 類能展現所有日誌入口,而另外一個能夠調度所有的日曆事件。 For example, one Sitemap class could represent all the entries of your weblog, while another could represent all of the events in your events calendar.

在最簡單的例子中,所有部分可以全部包含在一個 sitemap.xml 中,也可以使用架構來產生一個網站地圖,為每一個獨立的部分產生一個單獨的網站檔案。

Sitemap 類必須是 django.contrib.sitemaps.Sitemap 的子類. 他們可以存在於您的代碼樹的任何地方。

例如假設你有一個blog系統,有一個 Entry 的model,並且你希望你的網站地圖包含所有連到你的blog入口的超連結。 你的 Sitemap 類很可能是這樣的:

from django.contrib.sitemaps import Sitemapfrom mysite.blog.models import Entryclass BlogSitemap(Sitemap):  changefreq = "never"  priority = 0.5  def items(self):    return Entry.objects.filter(is_draft=False)  def lastmod(self, obj):    return obj.pub_date

聲明一個 Sitemap 和聲明一個 Feed 看起來很類似;這都是預先設計好的。

如同 Feed 類一樣, Sitemap 成員也既可以是方法,也可以是屬性。

一個 Sitemap 類可以定義如下 方法/屬性:

items (必需 ):提供對象列表。 架構並不關心對象的 類型 ;唯一關心的是這些對象會傳遞給 location() , lastmod() , changefreq() ,和 priority() 方法。

location (可選): 給定對象的絕對URL。 絕對URL不包含協議名稱和網域名稱。 下面是一些例子:

  • 好的: '/foo/bar/' '/foo/bar/'
  • 差的: 'example.com/foo/bar/' 'example.com/foo/bar/'

如果沒有提供 location , 架構將會在每個 items() 返回的對象上調用 get_absolute_url() 方法.

lastmod (可選): 對象的最後修改日期, 作為一個Python datetime 對象. The object's last modification date, as a Python datetime object.

changefreq (可選): 對象變更的頻率。 可選的值如下(詳見Sitemaps文檔):

  • 'always'
  • 'hourly'
  • 'daily'
  • 'weekly'
  • 'monthly'
  • 'yearly'
  • 'never'
  • priority (可選): 取值範圍在 0.0 and 1.0 之間,用來表明優先順序。

捷徑

sitemap架構提供了一些常用的類。 在下一部分中會看到。
FlatPageSitemap

django.contrib.sitemaps.FlatPageSitemap 類涉及到網站中所有的flat page,並在sitemap中建立一個入口。 但僅僅只包含 location 屬性,不支援 lastmod , changefreq ,或者 priority 。

GenericSitemap

GenericSitemap 與所有的通用視圖一同工作(詳見第9章)。

你可以如下使用它,建立一個執行個體,並通過 info_dict 傳遞給通用視圖。 唯一的要求是字典包含 queryset 這一項。 也可以用 date_field 來指明從 queryset 中取回的對象的日期域。 這會被用作網站地圖中的 lastmod 屬性。

下面是一個使用 FlatPageSitemap and GenericSiteMap (包括前面所假定的 Entry 對象)的URLconf:

from django.conf.urls.defaults import *from django.contrib.sitemaps import FlatPageSitemap, GenericSitemapfrom mysite.blog.models import Entryinfo_dict = {  'queryset': Entry.objects.all(),  'date_field': 'pub_date',}sitemaps = {  'flatpages': FlatPageSitemap,  'blog': GenericSitemap(info_dict, priority=0.6),}urlpatterns = patterns('',  # some generic view using info_dict  # ...  # the sitemap  (r'^sitemap\.xml$',   'django.contrib.sitemaps.views.sitemap',   {'sitemaps': sitemaps}))

建立一個Sitemap索引

sitemap架構同樣可以根據 sitemaps 字典中定義的單獨的sitemap檔案來建立索引。 用法區別如下:

您在您的URLconf 中使用了兩個視圖: django.contrib.sitemaps.views.index 和 django.contrib.sitemaps.views.sitemap . `` django.contrib.sitemaps.views.index`` 和`` django.contrib.sitemaps.views.sitemap``

django.contrib.sitemaps.views.sitemap 視圖需要帶一個 section 關鍵字參數.

這裡是前面的例子的相關的 URLconf 行看起來的樣子:

(r'^sitemap.xml$', 'django.contrib.sitemaps.views.index', {'sitemaps': sitemaps}),(r'^sitemap-(?P.+).xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps})

這將自動產生一個 sitemap.xml 檔案, 它同時引用 sitemap-flatpages.xml 和 sitemap-blog.xml . Sitemap 類和 sitemaps 目錄根本沒有更改.
通知Google

當你的sitemap變化的時候,你會想通知Google,以便讓它知道對你的網站進行重新索引。 架構就提供了這樣的一個函數: django.contrib.sitemaps.ping_google() 。

ping_google() 有一個可選的參數 sitemap_url ,它應該是你的網站地圖的URL絕對位址(例如:

如果不能夠確定你的sitemap URL, ping_google() 會引發 django.contrib.sitemaps.SitemapNotFound 異常。

我們可以通過模型中的 save() 方法來調用 ping_google() :

from django.contrib.sitemaps import ping_googleclass Entry(models.Model):  # ...  def save(self, *args, **kwargs):    super(Entry, self).save(*args, **kwargs)    try:      ping_google()    except Exception:      # Bare 'except' because we could get a variety      # of HTTP-related exceptions.      pass

一個更有效解決方案是用 cron 指令碼或任務調度表來調用 ping_google() ,該方法使用Http直接請求Google伺服器,從而減少每次調用 save() 時佔用的網路頻寬。 The function makes an HTTP request to Google's servers, so you may not want to introduce that network overhead each time you call save() .

Finally, if 'django.contrib.sitemaps' is in your INSTALLED_APPS , then your manage.py will include a new command, ping_google . This is useful for command-line access to pinging. For example:

python manage.py ping_google /sitemap.xml
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.