Kerangka peta situs¶
Django comes with a high-level sitemap-generating framework to create sitemap XML files.
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.
It works much like Django's syndication framework. To create a sitemap, write a
Sitemap
class and point to it in your
URLconf.
Pemasangan¶
Untuk memasang aplikasi peta situs, ikuti langkah-langkah ini:
- Tambah
'django.contrib.sitemaps'
ke pengaturanINSTALLED_APPS
anda. - Pastikan pengaturan anda
TEMPLATES
mengandung sebuah backendDjangoTemplates
yang pilihanAPP_DIRS
disetel menjadiTrue
. Itu ada disana secara awalan, jadi anda hanya akan butuh merubah ini jika anda yelah merubah pengaturan itu. - 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
¶
A Sitemap
class is a Python class that
represents a "section" of entries in your sitemap. For example, one
Sitemap
class could represent all the entries
of your blog, while another could represent all of the events in your events
calendar.
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¶
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
danpriority
adalah atribut kelas berhubungan pada unsur<changefreq>
dan<priority>
, masing-masing. Mereka dapat dibuat callable sebagai fungsi, sepertilastmod
calam contoh ini.items()
is a method that returns a sequence orQuerySet
of objects. The objects returned will get passed to any callable methods corresponding to a sitemap property (location
,lastmod
,changefreq
, andpriority
).lastmod
harus mengembalikan sebuahdatetime
.- Tidak ada metode
location
daam contoh ini, tetapi anda dapat menyediakan itu untuk menentukan URL untuk obyek anda. Secara awalan,location()
memanggilget_absolute_url()
pada setiap obyek dan mengembalikan hasil.
Acuan kelas Sitemap
¶
-
class
Sitemap
¶ Sebuah kelas
Sitemap
dapat menentukan metode/atribut berikut:-
items
¶ Required. A method that returns a sequence or
QuerySet
of objects. The framework doesn't care what type of objects they are; all that matters is that these objects get passed to thelocation()
,lastmod()
,changefreq()
andpriority()
methods.
-
location
¶ 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 metodeget_absolute_url()
pada setiap obyek sebagai dikembalikan olehitems()
.Untuk menentukan sebuah protokol selain dari
'http'
, gunakanprotocol
.- Baik:
-
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 sepertidatetime
.Jika itu adalah sebuah atribut, nilainya harus berupa
datetime
mewakilitanggal/waktu dirubah terakhir untuk setiap obyek dikembalikan olehitems()
.Jika semua barang dalam peta situs memiliki
lastmod
, peta situs dibangkitkan olehviews.sitemap()
akan mempunyai kepalaLast-Modified
setara padalastmod
terakhir. Anda dapat mengaktifkanConditionalGetMiddleware
untuk membuat Django menjawab sesuai permintaan dengan sebuah kepalaIf-Modified-Since
yang akan mencegah mengirim peta situs jika itu belum berubah.
-
paginator
¶ Pilihan.
This property returns a
Paginator
foritems()
. If you generate sitemaps in a batch you may want to override this as a cached property in order to avoid multipleitems()
calls.
-
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 adalah0.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'
.Ditinggalkan sejak versi 4.0: The default protocol for sitemaps built outside the context of a request will change from
'http'
to'https'
in Django 5.0.
-
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 adalahFalse
.
-
languages
¶ - New in Django 3.2.
Pilihan.
A sequence of language codes to use for generating alternate links when
i18n
is enabled. Defaults toLANGUAGES
.
-
alternates
¶ - New in Django 3.2.
Pilihan.
A boolean attribute. When used in conjunction with
i18n
generated URLs will each have a list of alternate links pointing to other language versions using the hreflang attribute. The default isFalse
.
-
x_default
¶ - New in Django 3.2.
Pilihan.
A boolean attribute. When
True
the alternate links generated byalternates
will contain ahreflang="x-default"
fallback entry with a value ofLANGUAGE_CODE
. The default isFalse
.
-
Jalan pintas¶
Kerangka kerja peta situs menyediakan sebuah kelas mudah untuk kasus tertentu:
-
class
GenericSitemap
(info_dict, priority=None, changefreq=None, protocol=None)¶ Kelas
django.contrib.sitemaps.GenericSitemap
mengizinkan anda membuat sebuah peta situs dengan melewatkan itu sebuah dictionary yang harus mengandung setidaknya sebuah masukanqueryset
. Himpunan permintaan ini akan digunakan untuk membangkitkan barang-barang dari peta situs. Itu mungkin juga memiliki masukandate_field
yang menentukan bidang tanggal untuk obyek-obyek diambil dariqueryset
. Ini akan digunakan untuk atributlastmod
dalam peta situs dibangkitkan.Argumen kata kunci
priority
,changefreq
, danprotocol
mengizinkan menentukan atribut-atribut ini untuk semua URL.
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:
- Anda dapat menggunakan dua tampilan dalam URLconf anda:
django.contrib.sitemaps.views.index()
dandjango.contrib.sitemaps.views.sitemap()
. - Tampilan
django.contrib.sitemaps.views.sitemap()
harus mengambil argumen kata kuncisection
.
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},
name='django.contrib.sitemaps.views.index'),
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'
}, name='django.contrib.sitemaps.views.index'),
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
:
alternates
changefreq
item
lastmod
tempat
prioritas
The alternates
attribute is available when i18n
and
alternates
are enabled. It is a list of other language
versions, including the optional x_default
fallback, for each
URL. Each alternate is a dictionary with location
and lang_code
keys.
The alternates
attribute was added.
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
(sitemap_url=None, ping_url=PING_URL, sitemap_uses_https=True)¶ ping_google
mengambil argumen-argumen pilihan ini:sitemap_url
- The absolute path to your site's sitemap (e.g.,'/sitemap.xml'
).If this argument isn't provided,
ping_google
will perform a reverse lookup in your URLconf, for URLs named'django.contrib.sitemaps.views.index'
and then'django.contrib.sitemaps.views.sitemap'
(without further arguments) to automatically determine the sitemap URL.ping_url
- Awalan pada Alat Ping Google: https://www.google.com/webmasters/tools/ping.sitemap_uses_https
- Disetel menjadiFalse
jika situs anda menggunakanhttp
daripadahttps
.
ping_google()
memunculkan pengecualiandjango.contrib.sitemaps.SitemapNotFound
jika itu tidak bisa menentukan URL peta situs anda.
Daftar dengan Google dahulu!
The ping_google()
command only works if you have registered your
site with Google Search Console.
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]
-
--sitemap-uses-http
¶
Gunakan pilihan ini jika peta situs anda menggunakan http
daripada https
.