Příkladem Django sitemap index

hlasů
4

Mám následující modely vztah:

class Section(models.Model):
    section = models.CharField(max_length=200, unique=True)
    name = models.CharField(max_length=200, blank = True)


class Article (models.Model):
    url = models.CharField(max_length = 30, unique=True)
    is_published = models.BooleanField()  
    section = models.ForeignKey(Section)

Musím vytvořit sitemap pro předměty, které obsahují soubory Sitemap pro oddíly. Četl jsem Django dokumentaci o tom zde http://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/

Ale nepodařilo najít odpověď, jak můžu:

  1. Definovat mapa webu třídu v tomto případě
  2. Jak mohu předat sekci parametry do souboru s URL (jak je to vysvětleno v docs)
  3. Z místa, kde mohu získat { ‚sitemaps‘: Sitemaps} kdybych definována sitemap jako třída python v jiném souboru v aplikaci
Položena 08/09/2009 v 07:44
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
6

Pokud chápu správně, že chcete používat index souborů Sitemap, které by poukazovaly na samostatných xml mapa stránek každý pro každou sekci.

Django podporuje tuto funkci tím poskytuje samostatnou sitemapy pohled na index Sitemap.

Jsem nepoužil tuto funkci dříve, ale něco jako následující bude pravděpodobně fungovat ve vašem případě.

### sitemaps.py
from django.contrib.sitemaps import GenericSitemap
from models import Section

all_sitemaps = {}
for section in Section.objects.all():

    info_dict = {
        'queryset': section.article_set.filter(is_published=True),
    }

    sitemap = GenericSitemap(info_dict,priority=0.6)

    # dict key is provided as 'section' in sitemap index view
    all_sitemaps[section.name] = sitemap

### urls.py
from sitemaps import all_sitemaps as sitemaps

...
...
...

urlpatterns += patterns('',
        (r'^sitemap.xml$', 'django.contrib.sitemaps.views.index', {'sitemaps': sitemaps}),
        (r'^sitemap-(?P<section>.+)\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}),
)
Odpovězeno 08/09/2009 v 19:28
zdroj uživatelem

hlasů
0
Django==2.2
Python==3.6

Zde je lepší a snadný způsob, jak používat index souborů Sitemap v Django nainstalovat django.contrib.sitemapsdo projektu, přidejte jej do INSTALLED_APPSdne settings.py. Napsat sitemaps.py soubor ve svých aplikacích a definovat třídy, jak budete potřebovat. Příklad rozšíření django.contrib.sitemap.Sitemapv StaticViewSitemaptřídě mapa webu pro statické URL, ujistěte se, že všechny statické URL má název pro reversevyhledávání (dostat URL z názvu URL)

# app/sitemap.py

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

class StaticViewSitemap(sitemaps.Sitemap):
    priority = 0.6
    changefreq = 'monthly'

    def items(self):
        # URLs names
        return ['index', 'aboutus', 'ourstory',]

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

Importovat všechny sitemaps v urls.py dovozu Sitemap a index od django.contrib.sitemaps.views vytvořit slovník s sitemaps

# urls.py

from django.contrib.sitemaps.views import sitemap, index
from app.sitemaps import StaticViewSitemap

# add as many as sitemap you need as one key
sitemaps = {
    "static" : StaticViewSitemap,
}
urlpatterns = [

    # sitemap.xml index will have all sitemap-......xmls index
    path('sitemap.xml', index, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.index'),

    # sitemap-<section>.xml here <section> will be replaced by the key from sitemaps dict
    path('sitemap-<section>.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),
]

Zde budete mít dvě sitemaps 1. sitemaps.xml 2. sitemaps-static.xml Run serveru open URL: http: // localhost: 8000 / sitemap.xml

<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <sitemap>
        <loc>http://127.0.0.1:8000/sitemap-static.xml</loc>
    </sitemap>
</sitemapindex>

Django automaticky vytvořen index Sitemap nyní otevřený URL: http://127.0.0.1:8000/sitemap-static.xml

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>http://localhost:8000/</loc>
        <changefreq>monthly</changefreq>
        <priority>0.6</priority>
    </url>
    <url>
        <loc>http://localhost:8000/about-us</loc>
        <changefreq>monthly</changefreq>
        <priority>0.6</priority>
    </url>
    <url>
        <loc>http://localhost:8000/our-story</loc>
        <changefreq>monthly</changefreq>
        <priority>0.6</priority>
    </url>
</urlset>
Odpovězeno 19/10/2019 v 08:48
zdroj uživatelem

hlasů
0

Pro mě je přijata odpověď byla ovlivňuje vývoj a testování rychlosti cyklu, protože to dělalo python manage.pypříkazy pracovat pomaleji - měl jsem trochu víc k tomu v návrhu rozpočtu, než tento příklad.

Zde jsou změny, které jsem provedl s cílem zmírnit (přizpůsobený na příklad). Ještě bojovat vyzkoušet si to, ale zdá se, že stačit (Python3):

### sitemaps.py

class SitemapLookup():
    """
    Instantiated class replaces the dictionary of {'sitemap-section': Sitemap} for urls.py
    Speeds up application load time by only querying the DB when a sitemap is first requested.
    """

    def __init__(self):
        self.sitemaps = {}

    def __iter__(self):
        self._generate_sitemaps_dict()
        return self.sitemaps.__iter__()

    def __getitem__(self, key):
        self._generate_sitemaps_dict()
        return self.sitemaps[key]

    def items(self):
        self._generate_sitemaps_dict()
        return self.sitemaps.items()

    def _generate_sitemaps_dict(self):
        if self.sitemaps:
            return
        for section in Section.objects.all():
            info_dict = {
                'queryset': section.article_set.filter(is_published=True),
            }
            # dict key is provided as 'section' in sitemap index view
            self.sitemaps[section.name] = GenericSitemap(info_dict, priority=0.6)



### urls.py
from sitemaps import SitemapLookup

...
...
...

sitemaps = SitemapLookup()

urlpatterns += patterns('',
        (r'^sitemap.xml$', 'django.contrib.sitemaps.views.index', {'sitemaps': sitemaps}),
        (r'^sitemap-(?P<section>.+)\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}),
)
Odpovězeno 01/05/2017 v 19:38
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more