Ramverket för webbplatskartor¶
Django levereras med ett ramverk för generering av sitemap på hög nivå för att skapa sitemap XML-filer.
Översikt¶
En webbplatskarta är en XML-fil på din webbplats som berättar för sökmotorindexerare hur ofta dina sidor ändras och hur ”viktiga” vissa sidor är i förhållande till andra sidor på din webbplats. Den här informationen hjälper sökmotorer att indexera din webbplats.
Djangos ramverk för webbplatskartor automatiserar skapandet av denna XML-fil genom att låta dig uttrycka denna information i Python-kod.
Det fungerar ungefär som Djangos syndication-ramverk. För att skapa en webbplatskarta, skriv en Sitemap
-klass och peka på den i din URLconf.
Installation¶
Följ dessa steg för att installera appen för webbplatskartor:
Lägg till
'django.contrib.sitemaps'
i inställningenINSTALLED_APPS
.Se till att din
TEMPLATES
-inställning innehåller enDjangoTemplates
-backend varsAPP_DIRS
-alternativ är inställt påTrue
. Det finns där som standard, så du behöver bara ändra detta om du har ändrat den inställningen.Se till att du har installerat
sites-ramverket
.
(Obs: Applikationen för webbplatskartan installerar inga databastabeller. Den enda anledningen till att den behöver läggas in i INSTALLED_APPS
är så att Loader()
mallladdaren kan hitta standardmallarna)
Initialisering¶
- views.sitemap(request, sitemaps, section=None, template_name='sitemap.xml', content_type='application/xml')¶
För att aktivera generering av webbplatskartor på din Django-webbplats, lägg till den här raden i din URLconf:
from django.contrib.sitemaps.views import sitemap
path(
"sitemap.xml",
sitemap,
{"sitemaps": sitemaps},
name="django.contrib.sitemaps.views.sitemap",
)
Detta säger till Django att bygga en webbplatskarta när en klient öppnar /sitemap.xml
.
Namnet på sitemap-filen är inte viktigt, men platsen är det. Sökmotorer indexerar bara länkar i din sitemap för den aktuella URL-nivån och lägre. Om till exempel sitemap.xml
finns i din rotkatalog kan den referera till vilken URL som helst på din webbplats. Men om din webbplatskarta finns i /content/sitemap.xml
kan den bara referera till webbadresser som börjar med /content/
.
Sitemap-vyn tar ett extra, obligatoriskt argument: {'sitemaps': sitemaps}
. sitemaps
bör vara en ordbok som mappar en kort sektionsetikett (t.ex. blogg
eller nyheter
) till dess Sitemap
-klass (t.ex. BlogSitemap
eller NewsSitemap
). Den kan också mappa till en instans av en Sitemap
-klass (t.ex. BlogSitemap(some_var)
).
klasserna Sitemap
¶
En Sitemap
-klass är en Python-klass som representerar ett ”avsnitt” av poster i din webbplatskarta. Till exempel: kan en sitemap
-klass representera alla poster i din blogg, medan en annan kan representera alla händelser i din evenemangskalender.
I det enklaste fallet klumpas alla dessa avsnitt ihop i en :fil:`sitemap.xml`, men det är också möjligt att använda ramverket för att generera ett sitemap-index som refererar till enskilda sitemap-filer, en per avsnitt. (Se ”Skapa ett sitemap-index” nedan.)
Sitemap
-klasser måste vara underklasser till django.contrib.sitemaps.Sitemap
. De kan finnas var som helst i din kodbas.
Ett exempel¶
Låt oss anta att du har ett bloggsystem, med en Entry
-modell, och du vill att din sitemap ska innehålla alla länkar till dina enskilda blogginlägg. Så här kan din sitemap-klass se ut:
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
Anteckning:
changefreq
ochpriority
är klassattribut som motsvarar elementen<changefreq>
respektive<priority>
. De kan göras anropbara som funktioner, somlastmod
var i exemplet.items()
är en metod som returnerar en sekvens ellerQuerySet
av objekt. De returnerade objekten kommer att skickas till alla anropsbara metoder som motsvarar en sitemap-egenskap (location
,lastmod
,changefreq
, ochpriority
).Det finns ingen metod
location
i det här exemplet, men du kan ange den för att ange URL:en för ditt objekt. Som standard anroparlocation()
get_absolute_url()
på varje objekt och returnerar resultatet.
klassreferens för Sitemap
¶
- class Sitemap[source]¶
En
Sitemap
-klass kan definiera följande metoder/attribut:- items[source]¶
Krävs. En metod som returnerar en sekvens eller
QuerySet
av objekt. Ramverket bryr sig inte om vilken typ av objekt de är; allt som betyder något är att dessa objekt skickas till metodernalocation()
,lastmod()
,changefreq()
ochpriority()
.
- location[source]¶
Optionell. Antingen en metod eller ett attribut.
Om det är en metod ska den returnera den absoluta sökvägen för ett givet objekt som returneras av
items()
.Om det är ett attribut ska dess värde vara en sträng som representerar en absolut sökväg som ska användas för alla objekt som returneras av
items()
.I båda fallen betyder ”absolut sökväg” en URL som inte innehåller protokollet eller domänen. Exempel på detta:
Bra:
'/foo/bar/'`
Dålig:
'example.com/foo/bar/'`
Dåligt:
'https://example.com/foo/bar/'`
Om
location
inte anges kommer ramverket att anropa metodenget_absolute_url()
på varje objekt som returneras avitems()
.För att ange ett annat protokoll än
'http'
, användprotocol
.
- lastmod¶
Optionell. Antingen en metod eller ett attribut.
Om det är en metod ska den ta ett argument - ett objekt som returneras av
items()
- och returnera objektets senast ändrade datum/tid som endatetime
.Om det är ett attribut ska dess värde vara en
datetime
som representerar det senast ändrade datumet/tiden för alla objekt som returneras avitems()
.Om alla objekt i en sitemap har en
lastmod
, kommer sitemap som genereras avviews.sitemap()
att ha enLast-Modified
header som är lika med den senastelastmod
. Du kan aktiveraConditionalGetMiddleware
för att få Django att svara på lämpligt sätt på förfrågningar med enIf-Modified-Since
header som förhindrar att webbplatskartan skickas om den inte har ändrats.
- paginator[source]¶
**Tillval
Denna egenskap returnerar en
Paginator
föritems()
. Om du genererar sitemaps i en batch kanske du vill åsidosätta detta som en cachad egenskap för att undvika fleraitems()
-anrop.
- changefreq¶
Optionell. Antingen en metod eller ett attribut.
Om det är en metod ska den ta ett argument - ett objekt som returneras av
items()
- och returnera objektets ändringsfrekvens som en sträng.Om det är ett attribut ska dess värde vara en sträng som representerar ändringsfrekvensen för alla objekt som returneras av
items()
.Möjliga värden för
changefreq
, oavsett om du använder en metod eller ett attribut, är:'alltid'`
`timme`
`dagligen`
`veckotidning
`månadsvis`
`årligen`
”aldrig
- priority¶
Optionell. Antingen en metod eller ett attribut.
Om det är en metod ska den ta ett argument - ett objekt som returneras av
items()
- och returnera objektets prioritet som antingen en sträng eller en float.Om det är ett attribut ska dess värde vara antingen en sträng eller en float som representerar prioriteten för alla objekt som returneras av
items()
.Exempel på värden för
priority
:0.4
,1.0
. Standardprioriteten för en sida är0.5
. Se sitemaps.org documentation för mer information.
- protocol¶
**Tillval
Detta attribut definierar protokollet (
'http'
eller'https'
) för webbadresserna i webbplatskartan. Om det inte anges används det protokoll som webbplatskartan begärdes med. Om webbplatskartan skapas utanför ramen för en begäran är standardvärdet ``’https’’.
- limit¶
**Tillval
Detta attribut definierar det maximala antalet webbadresser som ingår på varje sida i webbplatskartan. Dess värde bör inte överstiga standardvärdet
50000
, vilket är den övre gräns som tillåts i Sitemaps-protokollet.
- i18n¶
**Tillval
Ett booleskt attribut som anger om webbadresserna i den här webbplatskartan ska genereras med alla dina
LANGUAGES
. Standardvärdet ärFalse
.
- languages¶
**Tillval
En sekvens av språkkoder som ska användas för att generera alternativa länkar när
i18n
är aktiverad. Standard ärLANGUAGES
.
- alternates¶
**Tillval
Ett boolean-attribut. När det används tillsammans med
i18n
kommer genererade URL:er att ha en lista med alternativa länkar som pekar på andra språkversioner med hjälp av hreflang-attributet. Standardvärdet ärFalse
.
- x_default¶
**Tillval
Ett booleanskt attribut. När det är
True
kommer de alternativa länkar som genereras avalternates`
att innehålla enhreflang="x-default"
fallback-post med ett värde avLANGUAGE_CODE
. Standardvärdet ärFalse
.
- get_latest_lastmod()[source]¶
**En metod som returnerar det senaste värdet som returneras av
lastmod
. Denna funktion används för att lägga till attributetlastmod
till Sitemap index context variables.Som standard returnerar
get_latest_lastmod()
:Om
lastmod
är en metod: Den senastelastmod
som returneras genom att anropa metoden med alla objekt som returneras avSitemap.items()
.
- get_languages_for_item(item)[source]¶
**En metod som returnerar den sekvens av språkkoder som objektet visas för. Som standard returnerar
get_languages_for_item()
languages
.
Genvägar¶
Ramverket för webbplatskartor tillhandahåller en bekvämlighetsklass för ett vanligt fall:
- class GenericSitemap(info_dict, priority=None, changefreq=None, protocol=None)[source]¶
Klassen
django.contrib.sitemaps.GenericSitemap
låter dig skapa en webbplatskarta genom att skicka en ordbok till den, som måste innehålla minst en post med namnetqueryset
. Denna queryset kommer att användas för att generera objekten i webbplatskartan. Den kan också ha endate_field
-post som anger ett datumfält för objekt som hämtas frånqueryset
. Detta kommer att användas för attributetlastmod
och metodernaget_latest_lastmod()
i den genererade webbplatskartan.Nyckelordsargumenten
priority
,changefreq
ochprotocol
gör det möjligt att ange dessa attribut för alla URL:er.
Exempel¶
Här är ett exempel på en URLconf som använder 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",
),
]
Sitemap för statiska vyer¶
Ofta vill du att sökmotorns sökrobotar ska indexera vyer som varken är objektdetaljsidor eller flatpages. Lösningen är att uttryckligen lista URL-namn för dessa vyer i items
och anropa reverse`()
i location
-metoden i sitemap. Till exempel:
# 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",
),
]
Skapa ett index över webbplatskartor¶
- views.index(request, sitemaps, template_name='sitemap_index.xml', content_type='application/xml', sitemap_url_name='django.contrib.sitemaps.views.sitemap')¶
Sitemap-ramverket har också möjlighet att skapa ett sitemap-index som refererar till enskilda sitemap-filer, en för varje avsnitt som definieras i din sitemaps
-dictionary. De enda skillnaderna i användning är:
Du använder två vyer i din URLconf:
django.contrib.sitemaps.views.index()
ochdjango.contrib.sitemaps.views.sitemap()
.Vyn
django.contrib.sitemaps.views.sitemap()
bör ta ett argument med nyckelordetsection
.
Så här skulle de relevanta URLconf-raderna se ut för exemplet ovan:
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",
),
]
Detta kommer automatiskt att generera en sitemap.xml
-fil som refererar till både sitemap-flatpages.xml
och sitemap-blog.xml
. Klasserna Sitemap
och dict sitemaps
ändras inte alls.
Om alla webbplatskartor har en lastmod
som returneras av Sitemap.get_latest_lastmod`()
kommer webbplatskartans index att ha en Last-Modified
header som är lika med den senaste lastmod
.
Du bör skapa en indexfil om en av dina sitemaps har mer än 50 000 webbadresser. I det här fallet kommer Django automatiskt att paginera webbplatskartan och indexet kommer att återspegla det.
Om du inte använder vaniljvyn för webbplatskartan - till exempel om den är förpackad med en cachningsdekorator - måste du namnge din webbplatskartvy och skicka sitemap_url_name
till indexvyn:
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",
),
]
Anpassning av mallar¶
Om du vill använda en annan mall för varje webbplatskarta eller index för webbplatskartor som finns på din webbplats kan du ange det genom att skicka en parameter ”template_name” till vyerna ”sitemap” och ”index” via 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",
),
]
Dessa vyer returnerar TemplateResponse
-instanser som gör att du enkelt kan anpassa svarsdata före rendering. För mer information, se TemplateResponse-dokumentation.
Variabler i sammanhanget¶
När du anpassar mallarna för vyerna index()
och sitemap()
kan du förlita dig på följande kontextvariabler.
Index¶
Variabeln sitemaps
är en lista med objekt som innehåller attributen location
och lastmod
för var och en av sitemaps. Varje URL innehåller följande attribut:
plats
: Platsen (webbadress och sida) för webbplatskartan.lastmod
: Fylls på av metodenget_latest_lastmod()
för varje webbplatskarta.
Webbplatskarta¶
Variabeln urlset
är en lista över webbadresser som ska visas i webbplatskartan. Varje URL har attribut som definieras i klassen Sitemap
:
alternativ
ändringsfrekvens
objekt
lastmod
plats
prioritet
Attributet alternates
är tillgängligt när i18n
och alternates
är aktiverade. Det är en lista över andra språkversioner, inklusive den valfria x_default
fallbacken, för varje URL. Varje alternativ är en ordbok med nycklarna location
och lang_code
.
Attributet item
har lagts till för varje URL för att möjliggöra mer flexibel anpassning av mallarna, t.ex. Google news sitemaps. Om man antar att Sitemap items()
skulle returnera en lista över objekt med publication_data
och ett tags
-fält skulle något liknande detta generera en Google News-kompatibel webbplatskarta:
<?xml version="1.0" encoding="UTF-8"?>
<urlset
xmlns="https://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:news="https://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>