Django 2.1 - The sitemap framework

साइटमैप रूपरेखा




django

साइटमैप रूपरेखा

Django एक उच्च-स्तरीय साइटमैप-जनरेटिंग फ्रेमवर्क के साथ आता है जो sitemap XML फ़ाइलों को बनाना आसान बनाता है।

अवलोकन

आपकी साइट पर एक साइटमैप एक XML फ़ाइल है जो खोज-इंजन इंडेक्सर्स को बताती है कि आपके पृष्ठ कितनी बार बदलते हैं और आपकी साइट के अन्य पृष्ठों के संबंध में "महत्वपूर्ण" कुछ पृष्ठ कितने महत्वपूर्ण हैं। यह जानकारी खोज इंजन को आपकी साइट को अनुक्रमित करने में मदद करती है।

Django साइटमैप फ्रेमवर्क इस XML फ़ाइल के निर्माण को स्वचालित करके आपको पायथन कोड में इस जानकारी को व्यक्त करने देता है।

यह बहुत हद तक Django के सिंडिकेशन फ्रेमवर्क की तरह काम करता है। साइटमैप बनाने के लिए, बस Sitemap क्लास लिखें और इसे अपने URLconf में इंगित करें।

स्थापना

साइटमैप एप्लिकेशन इंस्टॉल करने के लिए, इन चरणों का पालन करें:

  1. अपनी INSTALLED_APPS सेटिंग में 'django.contrib.sitemaps' जोड़ें।
  2. सुनिश्चित करें कि आपके DjangoTemplates सेटिंग में एक DjangoTemplates बैकएंड है, जिसका APP_DIRS विकल्प True सेट है। यह डिफ़ॉल्ट रूप से वहाँ है, इसलिए यदि आपने उस सेटिंग को बदल दिया है, तो आपको केवल इसे बदलना होगा।
  3. सुनिश्चित करें कि आपने 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 लाइनें इस तरह दिखेंगी:

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.xmlsitemap-blog.xml फ़ाइल उत्पन्न करेगा जो sitemap-blog.xmlsitemap-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]