Django 2.1 - The sitemap framework
साइटमैप रूपरेखा

साइटमैप रूपरेखा
Django एक उच्च-स्तरीय साइटमैप-जनरेटिंग फ्रेमवर्क के साथ आता है जो sitemap XML फ़ाइलों को बनाना आसान बनाता है।
अवलोकन
आपकी साइट पर एक साइटमैप एक XML फ़ाइल है जो खोज-इंजन इंडेक्सर्स को बताती है कि आपके पृष्ठ कितनी बार बदलते हैं और आपकी साइट के अन्य पृष्ठों के संबंध में "महत्वपूर्ण" कुछ पृष्ठ कितने महत्वपूर्ण हैं। यह जानकारी खोज इंजन को आपकी साइट को अनुक्रमित करने में मदद करती है।
Django साइटमैप फ्रेमवर्क इस XML फ़ाइल के निर्माण को स्वचालित करके आपको पायथन कोड में इस जानकारी को व्यक्त करने देता है।
यह बहुत हद तक Django के
सिंडिकेशन फ्रेमवर्क
की तरह काम करता है।
साइटमैप बनाने के लिए, बस
Sitemap
क्लास लिखें और इसे अपने
URLconf
में इंगित करें।
स्थापना
साइटमैप एप्लिकेशन इंस्टॉल करने के लिए, इन चरणों का पालन करें:
-
अपनी
INSTALLED_APPS
सेटिंग में'django.contrib.sitemaps'
जोड़ें। -
सुनिश्चित करें कि आपके
DjangoTemplates
सेटिंग में एकDjangoTemplates
बैकएंड है, जिसकाAPP_DIRS
विकल्पTrue
सेट है। यह डिफ़ॉल्ट रूप से वहाँ है, इसलिए यदि आपने उस सेटिंग को बदल दिया है, तो आपको केवल इसे बदलना होगा। -
सुनिश्चित करें कि आपने
sites framework
स्थापित कर लिया है।
(नोट: साइटमैप एप्लिकेशन किसी भी डेटाबेस तालिकाओं को स्थापित नहीं करता है। केवल एकमात्र कारण जिसे
INSTALLED_APPS
में जाने की आवश्यकता है ताकि
Loader()
टेम्पलेट लोडर डिफ़ॉल्ट टेम्पलेट पा सके।)
प्रारंभ
-
views.sitemap(request, sitemaps, section=None, template_name='sitemap.xml', content_type='application/xml')
अपने Django साइट पर साइटमैप पीढ़ी को सक्रिय करने के लिए, इस लाइन को अपने URLconf :
from django.contrib.sitemaps.views import sitemap path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap')
यह Django को एक साइटमैप बनाने के लिए कहता है जब एक क्लाइंट
/sitemap.xml
एक्सेस
/sitemap.xml
।
साइटमैप फ़ाइल का नाम महत्वपूर्ण नहीं है, लेकिन स्थान है।
वर्तमान URL स्तर और उससे नीचे के लिए खोज इंजन आपके साइटमैप में केवल लिंक्स को अनुक्रमित करेगा।
उदाहरण के लिए, यदि
sitemap.xml
आपके मूल निर्देशिका में रहता है, तो यह आपकी साइट के किसी भी URL को संदर्भित कर सकता है।
हालाँकि, यदि आपका साइटमैप
/content/sitemap.xml
पर रहता है, तो यह केवल संदर्भ URL हो सकता है जो
/content/
साथ शुरू होता है।
साइटमैप दृश्य एक अतिरिक्त, आवश्यक तर्क लेता है:
{'sitemaps': sitemaps}
।
sitemaps
एक ऐसा शब्दकोश होना चाहिए जो एक छोटे खंड के लेबल (जैसे,
blog
या
news
) को उसके
Sitemap
वर्ग (जैसे,
BlogSitemap
या
NewsSitemap
) में
NewsSitemap
।
यह
Sitemap
वर्ग (उदाहरण के लिए,
BlogSitemap(some_var)
) के
उदाहरण
के लिए भी मैप कर सकता है।
Sitemap
कक्षाएं
Sitemap
क्लास एक साधारण पायथन क्लास है जो आपके साइटमैप में प्रविष्टियों के "अनुभाग" का प्रतिनिधित्व करता है।
उदाहरण के लिए, एक
Sitemap
वर्ग आपके वेबलॉग की सभी प्रविष्टियों का प्रतिनिधित्व कर सकता है, जबकि दूसरा आपके ईवेंट कैलेंडर में सभी घटनाओं का प्रतिनिधित्व कर सकता है।
सबसे सरल मामले में, ये सभी अनुभाग एक साइटमैप में एक साथ
sitemap.xml
। लेकिन यह भी संभव है कि साइटमैप इंडेक्स उत्पन्न करने के लिए फ्रेमवर्क का उपयोग करना संभव हो, जो व्यक्तिगत साइटमैप फ़ाइलों, एक अनुभाग के संदर्भ में हो।
(नीचे
एक साइटमैप इंडेक्स बनाते हुए
देखें।)
Sitemap
कक्षाओं को
django.contrib.sitemaps.Sitemap
को उप-वर्ग करना होगा।
वे आपके कोडबेस में कहीं भी रह सकते हैं।
एक साधारण उदाहरण
मान लेते हैं कि आपके पास एक
Entry
मॉडल के साथ एक ब्लॉग सिस्टम है, और आप चाहते हैं कि आपका साइटमैप आपके व्यक्तिगत ब्लॉग प्रविष्टियों के सभी लिंक शामिल करे।
यहां बताया गया है कि आपका साइटमैप वर्ग कैसा दिख सकता है:
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
ध्यान दें:
-
क्रमशः
changefreq
औरpriority
वर्ग के गुण हैं<changefreq>
और<priority>
तत्व। उन्हें फ़ंक्शन के रूप मेंlastmod
योग्य बनाया जा सकता है, जैसा कि अंतिम बार उदाहरण में था। -
items()
केवल एक विधि है जो वस्तुओं की सूची लौटाती है। दी गई वस्तुएं साइटमैप प्रॉपर्टी (location
, अंतिम,changefreq
, औरpriority
) के अनुरूप किसी भी कॉल करने योग्य तरीकों से पास हो जाएंगी। -
lastmod
कोlastmod
लौटना चाहिए। -
इस उदाहरण में कोई
location
विधि नहीं है, लेकिन आप इसे अपने ऑब्जेक्ट के लिए URL निर्दिष्ट करने के लिए प्रदान कर सकते हैं। डिफ़ॉल्ट रूप से, location प्रत्येक ऑब्जेक्ट परget_absolute_url()
location कॉलget_absolute_url()
और परिणाम देता है।
Sitemap
श्रेणी संदर्भ
-
class Sitemap
[source] -
एक
Sitemap
वर्ग निम्नलिखित विधियों / विशेषताओं को परिभाषित कर सकता है:-
items
[source] -
आवश्यक है। एक विधि जो वस्तुओं की सूची लौटाती है। फ्रेमवर्क इस बात की परवाह नहीं करता कि वे किस प्रकार की वस्तुएँ हैं; यह सब मायने रखता है कि ये ऑब्जेक्ट location , lastmod , changefreq और changefreq priority मेथड्स में पास हो जाते हैं।
-
location
[source] -
वैकल्पिक। या तो एक विधि या विशेषता।
यदि यह एक विधि है, तो यह किसी दिए गए ऑब्जेक्ट के लिए निरपेक्ष पथ को वापस करना चाहिए जैसा कि
items()
द्वारा लौटाया गया है।यदि यह एक विशेषता है, तो इसका मूल्य एक स्ट्रिंग होना चाहिए जो
items()
द्वारा लौटाए गए प्रत्येक ऑब्जेक्ट के उपयोग के लिए एक निरपेक्ष पथ का प्रतिनिधित्व करता है।दोनों ही मामलों में, "निरपेक्ष पथ" का अर्थ है एक ऐसा URL जिसमें प्रोटोकॉल या डोमेन शामिल नहीं है। उदाहरण:
-
अच्छा:
'/foo/bar/'
-
खराब:
'example.com/foo/bar/'
-
खराब:
'https://example.com/foo/bar/'
यदि
location
प्रदान नहीं किया गया है, तो रूपरेखा प्रत्येकitems()
परget_absolute_url()
विधि कोitems()
द्वारा वापसget_absolute_url()
।'http'
अलावा किसी प्रोटोकॉल को निर्दिष्ट करने के लिए,protocol
उपयोग करें। -
अच्छा:
-
lastmod
-
वैकल्पिक। या तो एक विधि या विशेषता।
यदि यह एक विधि है, तो इसे एक तर्क लेना चाहिए -
items()
द्वारा लौटाए गए ऑब्जेक्ट के रूप मेंitems()
- और उस वस्तु की अंतिम संशोधित तिथि / समय कोdatetime
रूप में वापस करें।यदि यह एक विशेषता है, तो इसका मूल्य
items()
द्वारा लौटाए गए प्रत्येक ऑब्जेक्ट के लिए अंतिम संशोधित तिथि / समय का प्रतिनिधित्व करने वालाdatetime
होना चाहिए।यदि किसी साइटमैप के सभी आइटम्स में एक
views.sitemap()
, तोviews.sitemap()
द्वारा उत्पन्न साइटमैप में नवीनतमlastmod
बराबरLast-Modified
हेडर होगा। आप Django को एकIf-Modified-Since
हेडर के साथ अनुरोधों का उचित रूप से जवाब देने के लिएConditionalGetMiddleware
को सक्रिय कर सकते हैं जो परिवर्तन नहीं होने पर साइटमैप भेजने से रोक देगा।
-
changefreq
-
वैकल्पिक। या तो एक विधि या विशेषता।
यदि यह एक विधि है, तो इसे एक तर्क लेना चाहिए - एक वस्तु जैसा कि
items()
द्वारा लौटाया गयाitems()
- और एक स्ट्रिंग के रूप में उस वस्तु की परिवर्तन आवृत्ति लौटाएं।यदि यह एक विशेषता है, तो इसका मूल्य एक स्ट्रिंग होना चाहिए जो
items()
द्वारा लौटाए गए प्रत्येक ऑब्जेक्ट की परिवर्तन आवृत्ति का प्रतिनिधित्व करता हैitems()
।changefreq
संभावित मान, चाहे आप किसी विधि या विशेषता का उपयोग करें, ये हैं:-
'always'
-
'hourly'
-
'daily'
-
'weekly'
-
'monthly'
-
'yearly'
-
'never'
-
-
priority
-
वैकल्पिक। या तो एक विधि या विशेषता।
यदि यह एक विधि है, तो इसे एक तर्क लेना चाहिए - एक वस्तु जैसा कि
items()
द्वारा लौटाया गया हैitems()
- और एक स्ट्रिंग या फ्लोट के रूप में उस वस्तु की प्राथमिकता लौटाएं।यदि यह एक विशेषता है, तो इसका मूल्य या तो एक स्ट्रिंग होना चाहिए या
items()
द्वारा लौटाए गए प्रत्येक ऑब्जेक्ट की प्राथमिकता का प्रतिनिधित्व करने वाला फ्लोट होना चाहिएitems()
।priority
लिए उदाहरण मान:0.4
,1.0
। किसी पृष्ठ की डिफ़ॉल्ट प्राथमिकता0.5
। अधिक के लिए sitemaps.org प्रलेखन देखें।
-
protocol
-
वैकल्पिक।
यह विशेषता साइटमैप में URL के प्रोटोकॉल (
'http'
या'https'
) को परिभाषित करती है। यदि यह सेट नहीं है, तो जिस प्रोटोकॉल के साथ साइटमैप का अनुरोध किया गया था, उसका उपयोग किया जाता है। यदि साइटमैप किसी अनुरोध के संदर्भ में बनाया गया है, तो डिफ़ॉल्ट'http'
।
-
limit
-
वैकल्पिक।
यह विशेषता साइटमैप के प्रत्येक पृष्ठ पर शामिल URL की अधिकतम संख्या को परिभाषित करती है। इसका मान
50000
के डिफ़ॉल्ट मान से अधिक नहीं होना चाहिए, जो साइटमैप प्रोटोकॉल में दी गई ऊपरी सीमा है ।
-
i18n
-
वैकल्पिक।
एक बूलियन विशेषता जो परिभाषित करती है कि इस साइटमैप के URL आपके सभी भाषाओं के उपयोग से उत्पन्न होने चाहिए। डिफ़ॉल्ट
False
।
-
शॉर्टकट
साइटमैप ढांचा एक सामान्य मामले के लिए एक सुविधा वर्ग प्रदान करता है:
-
class GenericSitemap(info_dict, priority=None, changefreq=None, protocol=None)
[source] -
django.contrib.sitemaps.GenericSitemap
वर्ग आपको एक ऐसा शब्दकोश बनाकर एक साइटमैप बनाने की अनुमति देता है, जिसमें कम से कम एकqueryset
प्रविष्टि होती है। इस क्वेरी का उपयोग साइटमैप की वस्तुओं को उत्पन्न करने के लिए किया जाएगा। इसमें एकdate_field
प्रविष्टि भी हो सकती है जोdate_field
से पुनर्प्राप्त की गई वस्तुओं के लिए एक दिनांक फ़ील्ड निर्दिष्ट करती है। इसका उपयोग उत्पन्न साइटमैप में अंतिम विशेषता के लिए किया जाएगा।priority
,changefreq
औरprotocol
कीवर्ड तर्क सभी URL के लिए इन विशेषताओं को निर्दिष्ट करने की अनुमति देते हैं।Django 2.0 में नया:protocol
कीवर्ड तर्क जोड़ा गया था।
उदाहरण
यहां URLconf का उपयोग करके URLconf का एक उदाहरण दिया गया है:
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'), ]
स्थिर विचारों के लिए साइटमैप
अक्सर आप चाहते हैं कि खोज इंजन क्रॉलर को उन विचारों को अनुक्रमणित करें जो न तो ऑब्जेक्ट विवरण पृष्ठ हैं और न ही फ़्लैटपेज।
समाधान
items
में इन विचारों के लिए URL नामों को स्पष्ट रूप से सूचीबद्ध करने और साइटमैप के
location
विधि में
reverse()
कॉल करने के लिए है।
उदाहरण के लिए:
# 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') ]
साइटमैप इंडेक्स बनाना
-
views.index(request, sitemaps, template_name='sitemap_index.xml', content_type='application/xml', sitemap_url_name='django.contrib.sitemaps.views.sitemap')
साइटमैप फ्रेमवर्क में एक साइटमैप इंडेक्स बनाने की क्षमता भी है जो आपके
sitemaps
शब्दकोश में परिभाषित प्रत्येक अनुभाग में से एक, व्यक्तिगत साइटमैप फ़ाइलों का संदर्भ देता है।
उपयोग में केवल अंतर हैं:
-
आप अपने URLconf में दो विचारों का उपयोग करते हैं:
django.contrib.sitemaps.views.index()
और views.sitemap() । -
views.sitemap()
दृश्य में
section
कीवर्ड तर्क रखना चाहिए।
ऊपर दी गई उदाहरण के लिए प्रासंगिक URLconf लाइनें इस तरह दिखेंगी:
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'), ]
यह स्वचालित रूप से एक
sitemap-flatpages.xml
।
sitemap-blog.xml
फ़ाइल उत्पन्न करेगा जो
sitemap-blog.xml
।
sitemap-flatpages.xml
और
sitemap-flatpages.xml
दोनों को संदर्भित करता है।
Sitemap
कक्षाएं और
sitemaps
तानाशाह बिल्कुल नहीं बदलते हैं।
यदि आपके साइटमैप में 50,000 से अधिक URL हैं, तो आपको एक इंडेक्स फ़ाइल बनानी चाहिए। इस मामले में, Django स्वचालित रूप से साइटमैप को बंद कर देगा, और सूचकांक यह दर्शाएगा।
यदि आप वेनिला साइटमैप दृश्य का उपयोग नहीं कर रहे हैं - उदाहरण के लिए, यदि यह कैशिंग डेकोरेटर के साथ लिपटा हुआ है - तो आपको अपने साइटमैप दृश्य को नाम देना होगा और साइटमैप को अनुक्रमणिका दृश्य में पास करना होगा:
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'), ]
खाका अनुकूलन
यदि आप अपनी साइट पर उपलब्ध प्रत्येक साइटमैप या साइटमैप इंडेक्स के लिए एक अलग टेम्प्लेट का उपयोग करना चाहते हैं, तो आप इसे URL के माध्यम से
sitemap
और
index
विचारों के लिए एक
template_name
पैरामीटर पास करके निर्दिष्ट कर सकते हैं:
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'), ]
ये दृश्य
TemplateResponse
उदाहरणों को लौटाते हैं, जो आपको रेंडर करने से पहले आसानी से प्रतिक्रिया डेटा को अनुकूलित करने की अनुमति देते हैं।
अधिक जानकारी के लिए,
टेम्प्लेट रिप्लेसमेंट प्रलेखन
देखें।
प्रसंग चर
django.contrib.sitemaps.views.index() और views.sitemap() दृश्यों के लिए टेम्पलेट्स को कस्टमाइज़ करते समय, आप निम्नलिखित संदर्भ चर पर भरोसा कर सकते हैं।
सूची
चर
sitemaps
प्रत्येक साइटमैप के लिए पूर्ण URL की एक सूची है।
साइटमैप
चर
urlset
URLs की एक सूची है जो साइटमैप में दिखाई देनी चाहिए।
Sitemap
वर्ग में परिभाषित प्रत्येक URL विशेषताओं को उजागर करता है:
-
changefreq
-
item
-
lastmod
-
location
-
priority
प्रत्येक URL के लिए
item
विशेषता को जोड़ा गया है ताकि वे अधिक लचीले कस्टमाइज़ेशन की अनुमति दे सकें, जैसे कि
Google समाचार साइटमैप
।
साइटमैप के
items()
मान लें
items()
publication_data
साथ आइटमों की एक सूची लौटाएगा /
publication_data
और एक
tags
फ़ील्ड कुछ इस तरह से Google समाचार संगत साइटमैप उत्पन्न करेगा:
<?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>
Google को पिंग करना
जब आपका साइटमैप बदल जाता है, तो आप उसे "पिंग" कर सकते हैं, ताकि वह आपकी साइट को देख सके।
साइटमैप ढांचा बस ऐसा करने के लिए एक फ़ंक्शन प्रदान करता है:
django.contrib.sitemaps.ping_google()
।
-
ping_google()
[source] -
django.contrib.sitemaps.ping_google() एक वैकल्पिक तर्क लेता है, django.contrib.sitemaps.ping_google() , जो आपकी साइट के साइटमैप (जैसे,
'/sitemap.xml'
) के लिए पूर्ण पथ होना चाहिए। यदि यह तर्क प्रदान नहीं किया जाता है, तो django.contrib.sitemaps.ping_google() आपके URLconf में रिवर्स लुकिंग प्रदर्शन करके आपके साइटमैप का पता लगाने का प्रयास करेगा।यदि यह आपके साइटमैप URL को निर्धारित नहीं कर सकता है तो django.contrib.sitemaps.ping_google() अपवाद
django.contrib.sitemaps.SitemapNotFound
उठाता है।
Google के साथ पहले पंजीकरण करें!
django.contrib.sitemaps.ping_google() कमांड केवल तभी काम करता है जब आपने अपनी साइट को Google वेबमास्टर टूल के साथ पंजीकृत किया हो।
django.contrib.sitemaps.ping_google()
कॉल करने का एक उपयोगी तरीका मॉडल की
save()
विधि से है:
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
हालांकि, एक अधिक कुशल समाधान, क्रोन स्क्रिप्ट या किसी अन्य निर्धारित कार्य से
django.contrib.sitemaps.ping_google()
को कॉल करना होगा।
फ़ंक्शन Google के सर्वरों के लिए एक HTTP अनुरोध करता है, इसलिए आप हर बार जब आप कॉल
save()
कहते हैं तो उस नेटवर्क को ओवरहेड से परिचित नहीं कराना चाहते हैं।
Google को
manage.py
माध्यम से
manage.py
-
django-admin ping_google [sitemap_url]
एक बार आपके प्रोजेक्ट में साइटमैप एप्लिकेशन जुड़ जाने के बाद, आप
ping_google
प्रबंधन कमांड का उपयोग करके Google को पिंग भी कर सकते हैं:
python manage.py ping_google [/sitemap.xml]