跳转到主要内容

Django的额外XML站点地图功能

项目描述

Django缺少的XML站点地图。

PyPI Version Supported Python versions Build Status Documentation Status GPL-2.0-only OR LGPL-2.1-or-later Coverage

功能

目前实现了以下XML站点地图

  • qartez.sitemaps.ImagesSitemap:根据规范的XML图像站点地图。

  • qartez.sitemaps.StaticSitemap:服务页面的站点地图。将命名模式或URL添加到站点地图中,以使其在单独的服务XML站点地图中很好地显示。

  • qartez.sitemaps.RelAlternateHreflangSitemap:实现rel="alternate" hreflang="x"的站点地图。阅读规范

先决条件

  • Django:1.11、2.0、2.1、2.2和3.0。

  • Python:2.7、3.5、3.6、3.7、3.8

安装

1. 安装

PyPI上的最新稳定版本

pip install django-qartez

GitHub上的最新稳定版本

pip install https://github.com/barseghyanartur/django-qartez/archive/stable.tar.gz

2. 将qartez添加到您的INSTALLED_APPS

INSTALLED_APPS = (
    # ...
    'django.contrib.sitemaps',
    'qartez',
    # ...
)

用法和示例

我们有一个虚构的foo应用。

查看示例代码

foo/sitemap.py

from django.contrib.sitemaps import Sitemap

from qartez.sitemaps import (
    ImagesSitemap, StaticSitemap, RelAlternateHreflangSitemap
)

from foo.models import FooItem

# ---------------------- XML images sitemap part ---------------------------
# Dictionary to feed to the images sitemap.
foo_item_images_info_dict = {
    # Base queryset to iterate when procuding a site map
    'queryset': FooItem._default_manager.exclude(image=None),
    'image_location_field': 'image_url', # Image location (URL)
    'image_title_field': 'title', # Image title
    # An absolute URL of the page where image is shown
    'location_field': 'get_absolute_url'
}

# XML images sitemap.
foo_item_images_sitemap = {
    'foo_item_images': ImagesSitemap(foo_item_images_info_dict,
                                     priority=0.6),
}

# ---------------------- Static sitemap part ---------------------------
# Sitemap for service pages like welcome and feedback.
foo_static_sitemap = StaticSitemap(priority=0.1, changefreq='never')
foo_static_sitemap.add_named_pattern('foo.welcome')
foo_static_sitemap.add_named_pattern('foo.contact')

# ---------------------- Normal sitemap part ---------------------------
# Normal Foo items sitemap.
class FooItemSitemap(Sitemap):
    changefreq = "weekly"
    priority = 1.0

    def location(self, obj):
       return obj.get_absolute_url()

    def lastmod(self, obj):
       return obj.date_published

    def items(self):
       return FooItem._default_manager.all()

# ---------------------- Alternate hreflang sitemap part ---------------
# Alternate hreflang sitemap.
class ArticleSitemap(RelAlternateHreflangSitemap):
    # If you want to serve the links on HTTPS.
    protocol = 'https'

    def alternate_hreflangs(self, obj):
       return [('en-us', obj.alternative_object_url),]

    def items(self):
       return FooItem._default_manager.all()

urls.py

from foo.sitemap import foo_item_images_sitemap, foo_static_sitemap
from foo.sitemap import FooItemAlternateHreflangSitemap, FooItemSitemap

sitemaps = {
    'foo-items': FooItemSitemap,
    'foo-items-alternate-hreflang': FooItemAlternateHreflangSitemap,
    'foo-static': foo_static_sitemap
}

urlpatterns = [
    # Sitemaps
    (
        r'^sitemap\.xml$',
        'django.contrib.sitemaps.views.index',
        {'sitemaps': sitemaps},
    ),

    (
        r'^sitemap-foo-images\.xml$',
        'qartez.views.render_images_sitemap',
        {'sitemaps': foo_item_images_sitemap},
    ),
]

请注意,只有在您打算使用 qartez.RelAlternateHreflangSitemap 的情况下,才需要添加 `'template_name': 'qartez/rel_alternate_hreflang_sitemap.xml'`

(
    r'^sitemap-(?P<section>.+)\.xml$',
    'django.contrib.sitemaps.views.sitemap',
    {
        'sitemaps': sitemaps,
        'template_name': 'qartez/rel_alternate_hreflang_sitemap.xml'
    }
),

为了更好地了解示例中提供了哪些模型和视图,请参阅下面的代码部分。

foo/models.py

class FooItem(models.Model):
    title = models.CharField(_("Title"), max_length=100)
    slug = models.SlugField(_("Slug"), unique=True)
    body = models.TextField(_("Body"))
    date_published = models.DateTimeField(
        _("Date published"),
        blank=True,
        null=True,
        auto_now_add=True
    )

    # Image to be used for XML images sitemap.
    image = models.ImageField(
        _("Headline image"),
        blank=True,
        null=True,
        upload_to='foo-images'
    )

    # URL to be used for alternative hreflang attribute.
    alternative_url = models.URLField(
        _("Alternative URL"),
        blank=True,
        null=True
    )

    class Meta:
       verbose_name = _("Foo item")
       verbose_name_plural = _("Foo items")

    def __str__(self):
       return self.title

    def get_absolute_url(self):
       kwargs = {'slug': self.slug}
       return reverse('foo.detail', kwargs=kwargs)

    # Shortcut to full image URL for XML images sitemap.
    def image_url(self):
       return self.image.url if self.image else ''

foo/views.py

# Service welcome page
def welcome(request, template_name='foo/welcome.html'):
    context = {}
    return render_to_response(
        template_name,
        context,
        context_instance=RequestContext(request)
    )

# Service contact page
def contact(request, template_name='foo/contact.html'):
    context = {}
    return render_to_response(template_name, context, \
                              context_instance=RequestContext(request))

foo/urls.py

urlpatterns = patterns('foo.views',
    # ...
    # Contact URL
    url(r'^contact/$', view='contact', name='foo.contact'),
    # ...
    # Welcome URL
    url(r'^welcome/$', view='welcome', name='foo.welcome'),
    # ...
)

许可证

GPL-2.0-only OR LGPL-2.1-or-later

支持

如有任何问题,请联系作者部分提供的电子邮箱。

作者

Artur Barseghyan <artur.barseghyan@gmail.com>

项目详情


下载文件

根据您的平台下载文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源代码分发

django-qartez-0.8.1.tar.gz (12.6 kB 查看哈希值)

上传日期 源代码

构建分发

django_qartez-0.8.1-py2.py3-none-any.whl (29.8 kB 查看哈希值)

上传日期 Python 2 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面