Skip to main content

Simple SEO & meta tag management for Django

Project description

django-snakeoil helps manage your <meta> tags.

Works on all supported Django versions using PostgreSQl, or with any database on Django 3.1+.

It offers full internationalization support (tags for multiple languages), content set dynamically from object attributes, automatic Opengraph image width and heights for ImageField, and more.

Full documentation

Getting started

To install, pip install django-snakeoil or use your favourite package manager.

You can use Snakeoil in two ways. If you’d like to attach metadata to an object, you can use the model abstract base class:

from snakeoil.models import SEOModel

class Article(SEOModel):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    main_image = models.Imagefield(blank=True, null=True)

    @property
    def author_name(self):
        return

    @property
    def snakeoil_metadata(self):
        metadata = {
            "default": [
                {
                    "name": "author",
                    "content": self.author.get_full_name(),
                },
                {"property": "og:title", "content": self.title},
            ]
        }
        if self.main_image:
            metadata.append(
                {"property": "og:image", "attribute": "main_image"}
            )
        return metadata

You can also override these tags in the admin per-object.

For situations where you can’t change the model (flatpages, third party apps) or don’t have one at all, there is an SEOPath model that maps paths to your meta tags.

Tags are added in the admin (or however else you like) as JSON. For example:

{
    "default": [
        {"name": "description", "property": "og:description", "content": "Meta description"},
        {"property": "og:title", "content": "My blog post"},
        {"name": "author", "attribute": "author_name"},
        {"property": "og:image", "static": "img/default.jpg"}
    ]
}

Where default will work for any language. You can replace default with a language code, e.g. “nl_NL”, and these tags will only display if the current language is Dutch. This will generate something like:

<meta name="description" property="og:description" content="Meta description">
<meta property="og:title" "content="My blog post">
<!-- from my_object.author_name -->
<meta name="author" content="Tom Carrick">
<!-- build a static URL -->
<meta property="og:image" content="/static/img/default.jpg">

Note that when using static, width and height are not added, but you may add these yourself. For ImageField, this will be added automatically:

{
    "default": [
        {"property": "og:image", "attribute": "main_image"}
    ]
}

Results in:

<meta property="og:image" content="/media/blog_1_main_image.jpg">
<meta property="og:image:width" content="640">
<meta property="og:image:height" content="480">

Django Templates

Add snakeoil to your INSTALLED_APPS:

INSTALLED_APPS = [
    "snakeoil",
    # ...
]

In your base template, add this where you want the tags to appear:

{% load snakeoil %}
{% block head %}
    {% meta %}
{% endblock %}

This will automatically find an object based on the get_absolute_url() of your model, by looking in the request context. If nothing is found, snakeoil will check for an SEOPath object for the current path. If you have an object, it is recommended to pass it into the tag directly to short-circuit the tag finding mechanisms:

{% meta my_obj %}

Jinja2

Set your environment:

from jinja2 import Environment
from snakeoil.jinja2 import get_meta_tags

def environment(**options):
    env = Environment(**options)
    env.globals.update(
        {
            "get_meta_tags": get_meta_tags,
            # ...
        }
    )
    return env

In your template:

{% block meta %}
    {% with meta_tags=get_meta_tags() %}
        {% include "snakeoil/seo.jinja2" %}
    {% endwith %}
{% endblock meta %}

To pass in an object:

{% block meta %}
    {% with meta_tags=get_meta_tags(my_object) %}
        {% include "snakeoil/seo.jinja2" %}
    {% endwith %}
{% endblock meta %}

Notes

Thanks to kezabelle for the name. For those wondering:

Metadata is often used for SEO purposes. A lot of people (rightly or not) consider SEO to be snakeoil. Also, SnakEOil. Very clever, I know.

The old version of django-snakeoil can be found on the old branch, but won’t be updated.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-snakeoil-1.1.2.tar.gz (15.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_snakeoil-1.1.2-py3-none-any.whl (16.6 kB view details)

Uploaded Python 3

File details

Details for the file django-snakeoil-1.1.2.tar.gz.

File metadata

  • Download URL: django-snakeoil-1.1.2.tar.gz
  • Upload date:
  • Size: 15.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.62.3 importlib-metadata/4.11.1 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for django-snakeoil-1.1.2.tar.gz
Algorithm Hash digest
SHA256 1d0ae03c15570f73e8c0d0586b3bcefdee89a25003856bcdf6744c57cfd38733
MD5 5180eb9eb1e05e3bfca10643693ff679
BLAKE2b-256 521f2970f493e697b3841cde5dfffa4b1c75109fd69f8d07fc35cb084c89ab92

See more details on using hashes here.

File details

Details for the file django_snakeoil-1.1.2-py3-none-any.whl.

File metadata

  • Download URL: django_snakeoil-1.1.2-py3-none-any.whl
  • Upload date:
  • Size: 16.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.62.3 importlib-metadata/4.11.1 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for django_snakeoil-1.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 e672ca19380b702a53631e90d174e6cc0fae3a5be28a0bce927807421c8cc527
MD5 8001ea4b096c0c47fc6db3b35a27e77a
BLAKE2b-256 5ef3e85a044ae964eb1795a7c654fff82c141bdbcf811edb6cdec7f82407159f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page