Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/barseghyanartur/django-qartez
The missing XML sitemaps for Django: images sitemap, static sitemaps, alternate hreflang sitemaps.
https://github.com/barseghyanartur/django-qartez
django xml-sitemap
Last synced: 18 days ago
JSON representation
The missing XML sitemaps for Django: images sitemap, static sitemaps, alternate hreflang sitemaps.
- Host: GitHub
- URL: https://github.com/barseghyanartur/django-qartez
- Owner: barseghyanartur
- Created: 2013-07-09T07:52:13.000Z (over 11 years ago)
- Default Branch: master
- Last Pushed: 2020-02-20T21:35:55.000Z (over 4 years ago)
- Last Synced: 2024-10-13T07:45:29.698Z (about 1 month ago)
- Topics: django, xml-sitemap
- Language: Python
- Homepage: https://pypi.python.org/pypi/django-qartez
- Size: 1.25 MB
- Stars: 14
- Watchers: 3
- Forks: 7
- Open Issues: 0
-
Metadata Files:
- Readme: README.rst
- Changelog: CHANGELOG.rst
- License: LICENSE_GPL2.0.txt
Awesome Lists containing this project
README
=============
django-qartez
=============
The missing XML sitemaps for Django... image:: https://img.shields.io/pypi/v/django-qartez.svg
:target: https://pypi.python.org/pypi/django-qartez
:alt: PyPI Version.. image:: https://img.shields.io/pypi/pyversions/django-qartez.svg
:target: https://pypi.python.org/pypi/django-qartez/
:alt: Supported Python versions.. image:: https://img.shields.io/travis/barseghyanartur/django-qartez/master.svg
:target: http://travis-ci.org/barseghyanartur/django-qartez
:alt: Build Status.. image:: https://readthedocs.org/projects/django-qartez/badge/?version=latest
:target: http://django-qartez.readthedocs.io/en/latest/?badge=latest
:alt: Documentation Status.. image:: https://img.shields.io/badge/license-GPL--2.0--only%20OR%20LGPL--2.1--or--later-blue.svg
:target: https://github.com/barseghyanartur/django-qartez/#License
:alt: GPL-2.0-only OR LGPL-2.1-or-later.. image:: https://coveralls.io/repos/github/barseghyanartur/django-qartez/badge.svg?branch=master&service=github
:target: https://coveralls.io/github/barseghyanartur/django-qartez?branch=master
:alt: CoverageFeatures
========
At the moment the following XML sitemaps are implemented:- `qartez.sitemaps.ImagesSitemap`: XML images sitemaps according to the `specs
`__.- `qartez.sitemaps.StaticSitemap`: Sitemap for service pages. Add named
patterns or URLs to the sitemap to have it nicely displayed in a separate
service XML sitemap.- `qartez.sitemaps.RelAlternateHreflangSitemap`: Sitemaps: rel="alternate"
hreflang="x" implementation. Read the `specs
`__.Prerequisites
=============
- Django: 1.11, 2.0, 2.1, 2.2 and 3.0.
- Python: 2.7, 3.5, 3.6, 3.7, 3.8Installation
============
1. Install
----------
Latest stable version on PyPI:.. code-block:: sh
pip install django-qartez
Latest stable version from GitHub:
.. code-block:: sh
pip install https://github.com/barseghyanartur/django-qartez/archive/stable.tar.gz
2. Add `qartez` to your `INSTALLED_APPS`
----------------------------------------.. code-block:: python
INSTALLED_APPS = (
# ...
'django.contrib.sitemaps',
'qartez',
# ...
)Usage and examples
==================
We have an imaginary foo app.See the `example code
`_.foo/sitemap.py
--------------
.. code-block:: pythonfrom 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.0def location(self, obj):
return obj.get_absolute_url()def lastmod(self, obj):
return obj.date_publisheddef 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
-------
.. code-block:: pythonfrom foo.sitemap import foo_item_images_sitemap, foo_static_sitemap
from foo.sitemap import FooItemAlternateHreflangSitemap, FooItemSitemapsitemaps = {
'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},
),
]Note, that it's necessary to add the
```'template_name': 'qartez/rel_alternate_hreflang_sitemap.xml'```
only in case if you are going to use the ``qartez.RelAlternateHreflangSitemap``... code-block:: python
(
r'^sitemap-(?P.+)\.xml$',
'django.contrib.sitemaps.views.sitemap',
{
'sitemaps': sitemaps,
'template_name': 'qartez/rel_alternate_hreflang_sitemap.xml'
}
),In order to just get a better idea what kind of models and views are given in
the example, see the code parts below.foo/models.py
-------------
.. code-block:: pythonclass 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.titledef 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
------------
.. code-block:: python# 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
-----------
.. code-block:: pythonurlpatterns = patterns('foo.views',
# ...
# Contact URL
url(r'^contact/$', view='contact', name='foo.contact'),
# ...
# Welcome URL
url(r'^welcome/$', view='welcome', name='foo.welcome'),
# ...
)License
=======
GPL-2.0-only OR LGPL-2.1-or-laterSupport
=======
For any issues contact me at the e-mail given in the `Author`_ section.Author
======
Artur Barseghyan