Kerangka peta situs

Django datang dengan kerangka kerja membangkitkan-peta situs tingkat-tinggi yang membuat pembuatan berkas-berkas XML sitemap mudah.

Ikhtisar

Sebuah peta situs adalah sebuah berkas file pada situs jaringan anda yang memberitahu pengindeks mesin-pencari seberapa sering halaman anda berubah dan seberapa "penting" halaman tertentu berada dalam hubungan ke halaman lain pada situs anda. Informasi ini membantu mesin pencari mengindeks situs anda.

Kerangka kerja peta situs Django mengotomatiskan pembuatan dari berkas XML ini dengan membiarkan anda menyatakan informasi ini di kode Python.

Ini sangat mirip syndication framework Django. Untuk membuat sebuah peta situs, cukup tulis sebuah kelas Sitemap dan menunjuk ke itu dalam URLconf anda.

Pemasangan

Untuk memasang aplikasi peta situs, ikuti langkah-langkah ini:

  1. Tambah 'django.contrib.sitemaps' ke pengaturan INSTALLED_APPS anda.
  2. Pastikan pengaturan anda TEMPLATES mengandung sebuah backend DjangoTemplates yang pilihan APP_DIRS disetel menjadi True. Itu ada disana secara awalan, jadi anda hanya akan butuh merubah ini jika anda yelah merubah pengaturan itu.
  3. Pastikan anda telah memasang sites framework.

(Catat: Aplikasi peta situs tidak memasang tabel-tabel basisdata apapun. Alasan satu-satunya itu butuh it needs untuk masuk INSTALLED_APPS adalah sehingga pemuat cetakan:func:~django.template.loaders.app_directories.Loader dapat menemukan cetakan-cetakan awalan.)

Inisialisasi

views.sitemap(request, sitemaps, section=None, template_name='sitemap.xml', content_type='application/xml')

Untuk mengaktifkan pembangkitan peta situs pada situs Django anda, tambah baris ini ke URLconf anda:

from django.contrib.sitemaps.views import sitemap

path('sitemap.xml', sitemap, {'sitemaps': sitemaps},
     name='django.contrib.sitemaps.views.sitemap')

Ini mengatakan Django membangun sebuah peta situs ketika seorang klien mengakses /sitemap.xml.

Nama dari berkas peta situs adalah tidak penting, tetapi tempat penting. Mesin pencari hanya mengindeks tautan dalam peta situs anda untuk tingkat URL saat ini dan dibawah. Sebagai contoh, jika sitemap.xml tinggal dalam direktori akar anda, itu mungkin mengacu URL apapun dalam situs anda. Bagaimanapun, jika peta situs anda tinggal di /content/sitemap.xml, itu mungkin hanya mengacu URL yang dimulai dengan /content/.

Tampilan peta situs mengambil sebuah tambahan, argumen diwajibkan: {'sitemaps': sitemaps}. sitemaps harus berupa dictionary yang memetakan label bagian pendek (misalnya., blog atau news) ke kelas Sitemap nya (misalnya, BlogSitemap atau NewsSitemap). Ity mungkin juga memetakan ke sebuah instance dari kelas Sitemap (misalnya, BlogSitemap(some_var)).

Kelas Sitemap

Sebuah kelas Sitemap adalah sebuah kelas sederhana Python yang mewakili sebuah "section" dari masukan dalam peta situs anda. Sebagai contoh, satu kelas Sitemap dapat mewakili semua masukan dari dari Weblog, selagi lainnya dapat mewakili semua dari acara-acara dalam kalender acara anda.

Dalam kasus tersederhana, semua bagian-bagian ini semua bagian ini dapat lumpuh bersama-sama menjadi satu sitemap.xml, tetapi itu juga memungkinkan menggunakan kerangka kerja untuk membangkitkan indeks peta situs yang mengacu berkas-berkas peta situs masing-masing, satu per bagian. (Lihat Creating a sitemap index dibawah ini.)

Kelas-kelas Sitemap harus mengsubkelaskan django.contrib.sitemaps.Sitemap. Mereka dapat tinggal dimana saja dalam basis kode anda.

Sebuah contoh sederhana

Mari kita beranggapan anda mempunyai sebuah sistem blog, dengan sebuah model Entry, dan anda ingin peta situs anda menyertakan semua tautan ke masukan blog pribadi anda. Ini adalah bagaimana kelas petasitus anda mungkin terlihat:

from django.contrib.sitemaps import Sitemap
from blog.models import Entry

class 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

Catatan:

  • changefreq dan priority adalah atribut kelas berhubungan pada unsur <changefreq> dan <priority>, masing-masing. Mereka dapat dibuat callable sebagai fungsi, seperti lastmod calam contoh ini.
  • items() adalah metode sederhana yang mengembalikan daftar obyek. Kembalian obyek-obyek akan dilewatkan ke metode callable apapun berhubungan pada sifat peta situs (location, lastmod, changefreq, dan priority).
  • lastmod harus mengembalikan sebuah datetime.
  • Tidak ada metode location daam contoh ini, tetapi anda dapat menyediakan itu untuk menentukan URL untuk obyek anda. Secara awalan, location() memanggil get_absolute_url() pada setiap obyek dan mengembalikan hasil.

Acuan kelas Sitemap

class Sitemap[sumber]

Sebuah kelas Sitemap dapat menentukan metode/atribut berikut:

items[sumber]

Diwajibkan. Sebuah metode yang mengembalikan daftar dari obyek. Kerangka kerja tidak peduli jenis apa dari obyek-obyek mereka; semua yang penting adalah obyek ini dilewatkan ke metode location(), lastmod(), changefreq() dan priority().

location[sumber]

Pilihan. Antara sebuah metode atau atribut.

Jika itu adalah sebuah metode, itu harus mengembalikan jalur mutlak untuk obyek yang diberikan sebagai dikembalikan oleh items().

Jika itu adalah sebuah atribut, nilainya harus berupa string mewakili sebuah jalur mutlak untuk digunakan setiap obyek dikembalikan oleh items().

Di kedua kasus, "absolute path" berarti sebuah URL yang tidak menyertakan protokol atau ranah. Contoh:

  • Baik: '/foo/bar/'
  • Buruk: 'example.com/foo/bar/'
  • Buruk: 'https://example.com/foo/bar/'

Jika location tidak disediakan, kerangka kerja akan memanggil metode get_absolute_url() pada setiap obyek sebagai dikembalikan oleh items().

Untuk menentukan sebuah protokol selain dari 'http', gunakan protocol.

lastmod

Pilihan. Antara sebuah metode atau atribut.

Jika itu adalah sebuah metode, itu harus mengambil satu argumen - sebuah obyek seperti dikembalikan oleh items() -- dan mengembalikan tanggal/waktu dirubah-terakhir obyek itu seperti datetime.

Jika itu adalah sebuah atribut, nilainya harus berupa datetime mewakilitanggal/waktu dirubah terakhir untuk setiap obyek dikembalikan oleh items().

Jika semua barang dalam peta situs memiliki lastmod, peta situs dibangkitkan oleh views.sitemap() akan mempunyai kepala Last-Modified setara pada lastmod terakhir. Anda dapat mengaktifkan ConditionalGetMiddleware untuk membuat Django menjawab sesuai permintaan dengan sebuah kepala If-Modified-Since yang akan mencegah mengirim peta situs jika itu belum berubah.

changefreq

Pilihan. Antara sebuah metode atau atribut.

Jika itu adalah metode, itu harus mangambil satu argumen -- sebuah obyek seperti dikembalikan oleh items() -- dan mengembalikan frekuensi perubahan obyek sebagai sebuah string.

Jika itu adalah sebuah atribut, nilainya harus berupa string mewakili frekuensi perubahan dari setiap obyek dikembalikan oleh items().

Nilai memungkinkan untuk changefreq, apakah anda menggunakan sebuah metode atau atribut, adalah:

  • 'always'
  • 'hourly'
  • 'daily'
  • 'daily'
  • 'daily'
  • 'yearly'
  • 'never'
priority

Pilihan. Antara sebuah metode atau atribut.

Jika itu adalah sebuah metode, itu harus mengambil satu argumen - sebuah obyek seperti dikembalikan oleh items() -- dan mengembalikan prioritas obyek itu antara string atau float.

Jika itu adalah sebuah atribut, nilainya harus antra string atau float mewakili prioritas dari setiap obyek dikembalikan oleh items().

Contoh nilai-nilai untuk priority: 0.4, 1.0. Prioritas awalan dari sebuah halaman adalah 0.5. Lihat sitemaps.org documentation untuk beberapa.

protocol

Pilihan.

Atribut ini menentukan protokol ('http' atau 'https') dari URL di peta situs. Jika itu tidak disetel, protokol dengan peta situs mana yang telah diminta digunakan. Jika peta situs dibangun diluar konteks dari permintaan, awalan adalah 'http'.

limit

Pilihan.

Atribut ini menentukan angka maksimal dari URL disertakan pada setiap halaman dari peta situs. Nilainya tidak harus melebihi nilai awalan dari 50000, yang merupakan batas teratas diijinkan dalam Sitemaps protocol.

i18n

Pilihan.

Sebuah atribut boolean yang menentukan jika URL dari peta situs ini harus dibangkitkan menggunakan semua LANGUAGES anda. Awalan adalah False.

Jalan pintas

Kerangka kerja peta situs menyediakan sebuah kelas mudah untuk kasus tertentu:

class GenericSitemap(info_dict, priority=None, changefreq=None, protocol=None)[sumber]

Kelas django.contrib.sitemaps.GenericSitemap mengizinkan anda membuat sebuah peta situs dengan melewatkan itu sebuah dictionary yang harus mengandung setidaknya sebuah masukan queryset. Himpunan permintaan ini akan digunakan untuk membangkitkan barang-barang dari peta situs. Itu mungkin juga memiliki masukan date_field yang menentukan bidang tanggal untuk obyek-obyek diambil dari queryset. Ini akan digunakan untuk atribut lastmod dalam peta situs dibangkitkan.

Argumen kata kunci priority, changefreq, dan protocol mengizinkan menentukan atribut-atribut ini untuk semua URL.

New in Django 2.0:

Argumen kata kunci protocol telah ditambahkan.

Contoh

Ini adalah contoh dari URLconf menggunakan GenericSitemap:

from django.contrib.sitemaps import GenericSitemap
from django.contrib.sitemaps.views import sitemap
from django.urls import path
from blog.models import Entry

info_dict = {
    'queryset': Entry.objects.all(),
    'date_field': 'pub_date',
}

urlpatterns = [
    # some generic view using info_dict
    # ...

    # the sitemap
    path('sitemap.xml', sitemap,
         {'sitemaps': {'blog': GenericSitemap(info_dict, priority=0.6)}},
         name='django.contrib.sitemaps.views.sitemap'),
]

Peta situs untuk tampilan tetap

Sering anda ingin perayap mesin pencari untuk mengindeks tampilan-tampilan yang tidak juga halaman-halaman rinci obyek maupun halaman datar. Pemecahanannya adalah secara tersirat daftar nama-nama URL untuk tampilan-tampilan ini dalam items dan panggil reverse() dalam metode location dari peta situs. Sebagai contoh:

# sitemaps.py
from django.contrib import sitemaps
from django.urls import reverse

class StaticViewSitemap(sitemaps.Sitemap):
    priority = 0.5
    changefreq = 'daily'

    def items(self):
        return ['main', 'about', 'license']

    def location(self, item):
        return reverse(item)

# urls.py
from django.contrib.sitemaps.views import sitemap
from django.urls import path

from .sitemaps import StaticViewSitemap
from . import views

sitemaps = {
    'static': StaticViewSitemap,
}

urlpatterns = [
    path('', views.main, name='main'),
    path('about/', views.about, name='about'),
    path('license/', views.license, name='license'),
    # ...
    path('sitemap.xml', sitemap, {'sitemaps': sitemaps},
         name='django.contrib.sitemaps.views.sitemap')
]

Membuat indeks peta situs

views.index(request, sitemaps, template_name='sitemap_index.xml', content_type='application/xml', sitemap_url_name='django.contrib.sitemaps.views.sitemap')

Kerangka kerja peta situs juga memiliki kemampuan membuat sebuah indeks peta situs yang mengacu ke berkas-berkas peta situs masing-masing, satu per setiap bagian ditentukan dalam dictionary sitemaps anda. Perbedaan hanya dalam penggunaan adalah:

Ini adalah apa yang baris-barus URLconf bersangkutan akan terlihat untuk contoh diatas:

from django.contrib.sitemaps import views

urlpatterns = [
    path('sitemap.xml', views.index, {'sitemaps': sitemaps}),
    path('sitemap-<section>.xml', views.sitemap, {'sitemaps': sitemaps},
         name='django.contrib.sitemaps.views.sitemap'),
]

Ini akan otomatis membangkirkan sebuah berkas sitemap.xml yang mengacu kedua sitemap-flatpages.xml dan sitemap-blog.xml. Kelas-kelas Sitemap dan dict sitemaps tidak berubah sama sekali.

Anda harus membuat sebuah berkas indeks jika satu dari peta situs anda mempunyai lebh dari 50,000 URL. Dalam kasus ini, Django akan otomatis memberikan nomor peta situs, dan indeks akan mencerminkan itu.

Jika anda tidak menggunakan tampilan peta situs vanilla -- sebagai contoh, jika itu dibungkus dengan penghias cache --anda harus menamai tampilanpeta situs anda dan melewatkan sitemap_url_name ke tampilan indeks:

from django.contrib.sitemaps import views as sitemaps_views
from django.views.decorators.cache import cache_page

urlpatterns = [
    path('sitemap.xml',
         cache_page(86400)(sitemaps_views.index),
         {'sitemaps': sitemaps, 'sitemap_url_name': 'sitemaps'}),
    path('sitemap-<section>.xml',
         cache_page(86400)(sitemaps_views.sitemap),
         {'sitemaps': sitemaps}, name='sitemaps'),
]

Penyesuaian cetakan

Jika anda berharap menggunakan cetakan berbeda untuk setiap peta situs atau indeks peta situs tersedia pada situs anda, anda mungkin menentukan itu dengan melewatkan parameter template_name ke tampilan sitemap dan index melalui URLconf:

from django.contrib.sitemaps import views

urlpatterns = [
    path('custom-sitemap.xml', views.index, {
        'sitemaps': sitemaps,
        'template_name': 'custom_sitemap.html'
    }),
    path('custom-sitemap-<section>.xml', views.sitemap, {
        'sitemaps': sitemaps,
        'template_name': 'custom_sitemap.html'
    }, name='django.contrib.sitemaps.views.sitemap'),
]

Tampilan ini mengembalikan instance TemplateResponse yang mengizinkan anda dengan mudah menyesuaikan data tanggapan sebelum membangun. Untuk rincian lebih, lihat TemplateResponse documentation.

Variabel konteks

Ketika penyesuaian cetakan untuk tampilan index() dan sitemap(), anda dapat bergantung padavariabel konteks berikut.

Indeks

Variabel sitemaps adalah daftar dari URL mutlak pada setiap peta situs.

Peta situs

Variabel urlset adalah daftar dari URL yang harus muncul dalam peta situs. Setiap URL menampilkan atribut-atribut seperti ditentukan dalam kelas Sitemap:

  • changefreq
  • item
  • lastmod
  • tempat
  • prioritas

Atribut item telah ditambahkan untuk setiap URL untuk mengizinkan penyesuaian lebih elastis dari cetakan-cetakan, seperti Google news sitemaps. Menganggap items() Peta situs akan mengembalikan daftar dari barang-barang dengan bidang publication_data dan tags sesuatu seperti ini akan membangkitkan peta situs sesuai Google News:

<?xml version="1.0" encoding="UTF-8"?>
<urlset
  xmlns="https://www.sitemaps.org/schemas/sitemap/0.9"
  xmlns:news="http://www.google.com/schemas/sitemap-news/0.9">
{% spaceless %}
{% for url in urlset %}
  <url>
    <loc>{{ url.location }}</loc>
    {% if url.lastmod %}<lastmod>{{ url.lastmod|date:"Y-m-d" }}</lastmod>{% endif %}
    {% if url.changefreq %}<changefreq>{{ url.changefreq }}</changefreq>{% endif %}
    {% if url.priority %}<priority>{{ url.priority }}</priority>{% endif %}
    <news:news>
      {% if url.item.publication_date %}<news:publication_date>{{ url.item.publication_date|date:"Y-m-d" }}</news:publication_date>{% endif %}
      {% if url.item.tags %}<news:keywords>{{ url.item.tags }}</news:keywords>{% endif %}
    </news:news>
   </url>
{% endfor %}
{% endspaceless %}
</urlset>

Meminta Google

Anda mugkin ingin "ping" Google ketika peta situs anda berubah, untuk membuat dia tahu indeks ulang situs anda. Kerangka kerja peta situs menyediakan fungsi untuk melakukan itu: django.contrib.sitemaps.ping_google().

ping_google()[sumber]

ping_google() mengambil argumen pilihan, sitemap_url, yang harus berupa jalur mutlak ke peta situs situs anda (misalnya, '/sitemap.xml'). Jika argumen ini tidak disediakan, ping_google() akan berusaha mengetahui peta situs anda dengan melakukan pencarian terbaik dalam URLconf anda.

ping_google() memunculkan pengecualian django.contrib.sitemaps.SitemapNotFound jika itu tidak bisa menentukan URL peta situs anda.

Daftar dengan Google dahulu!

Perintah ping_google() hanya bekerja jika anda telah mendaftarkan situs anda dengan Google Webmaster Tools.

Satu cara berguna untuk memanggil ping_google() adalah dari metode save() model:

from django.contrib.sitemaps import ping_google

class Entry(models.Model):
    # ...
    def save(self, force_insert=False, force_update=False):
        super().save(force_insert, force_update)
        try:
            ping_google()
        except Exception:
            # Bare 'except' because we could get a variety
            # of HTTP-related exceptions.
            pass

Sebuah pemecahan efesien lagi, bagaimanapun,akan dipanggil ping_google() dari sebuah tulisan cron, atau beberapa tugas terjadwal lainnya. Fungsi membuat sebuah permintaan HTTP ke peladen Google, jadi anda mungkin tidak ingin memperkenalkan jaringan berlebih setiap kali anda memanggil save().

Menghubungi Google melalui manage.py

django-admin ping_google [sitemap_url]

Sekali aplikasi peta situs ditambahkan ke proyek anda, anda mungkin juga meng-ping Google menggunakan perintah pengelolaan ping_google:

python manage.py ping_google [/sitemap.xml]
Back to Top