Skip to main content

django-despacer

A lightweight loader for the Django Template Language (DTL) that enables removing excess whitespace by using delimiters like {#- and -#}. It's lightweight because it adds just two regular expressions at template loading time and nothing to request handling time.

This package is intended as a demonstration of this feature. I'm hoping this feature will eventually be included in Django's core code, at which time this package will no longer be needed.

About

I'm a frugal pragmatic perfectionist (with deadlines).

As a perfectionist, I'm horrified by the HTML generated by DTL: so many empty lines and bits of text floating in space. Being pragmatic, I accept that perfect whitespace control that generates perfectly indented HTML is unrealistic; so I'll settle for merely better looking HTML. Being frugal, I won't repeatedly pay a price for it but I'm willing to pay just once (at template load time).

So, I created django-despacer, a Python package which meets these criteria.

Features:

  • At request handling time, it does nothing (no overhead added).
  • At template loading time, just two regular expressions are run to alter templates before they're passed to the template compiler.
    • When DEBUG is False (production), whitespace is removed as indicated by despacing indicators ({#-, -#}, {{-, -}}, {%-, -%}) that you add where you desire.
    • When DEBUG is True (development), only the despacing indicator - is removed. Whitespace is not removed so that DTL compiler error messages have the correct line numbers.
  • Just two regular expressions are added. It's lightweight.
  • My favourite feature: I can now add lots of comments (comments are a good thing), {#- yada yada -#}, without adding lots of blank lines to the HTML generated.

Function

Below ··· represents one or more consecutive space, tab, and new line characters.

  • When DEBUG is False (prod), when a DTL template is loaded:
    • ···{#-, -#}··· are replace with {#, #} respectively.
    • ···{%-, -%}··· are replace with {%, %} respectively.
    • ···{{-, -}}··· are replace with {{, }} respectively.
    • thereby removing blank lines and floating text in the generated HTML.
  • When DEBUG is True (dev), when a DTL template is loaded:
    • ··· is not removed; only the -. Why? The line numbers of the original DTL source code must match the line numbers in the compiler's input to have correct line numbers in any error messages. That's important in development.
    • {#-, -#} are replace with {#, #} respectively.
    • {%-, -%} are replace with {%, %} respectively.
    • {{-, -}} are replace with {{, }} respectively.

Usage

In my DTL templates I usually:

  • Despace before and after comments {#- yada yada -#}. I can now have many lines of comments without having many empty lines in my generated HTML!
  • Despace before but not after tags like {%- if ... %}. This omits the empty line but still has a new-line after. See if below.
  • Despace before and after when I want to squeeze things down more. See <button> below where I want a one-liner.
<div>
  {#- I can now add lots of comments to my template -#}
  {#- ... without adding a ton of empty lines! -#}
  {#- the {%- on the `if` below removes empty lines -#}
  {#- I added for readability -#}

  {%- if not user.is_authenticated %}
    Howdy, stranger!
  {%- else %}
    Welcome back, {{ user.name }}.
  {%- endif -%}

  <button>
    {#- Despacing before and after collapses <button> down to a one liner -#}
    {%- translate "Save and Publish" -%}
    {#- Isn't it just great to be able to add lots of comments! -#}
  </button>
</div>

Without django-despacer (and without the -), the HTML would look like:

<div>
  
  




    Howdy, stranger!
  


  <button>
    
    Save and Publish
    
  </button>
</div>

... but with django-despacer:

<div>
    Howdy, stranger!
  <button>Save and Publish</button>
</div>

Installation

  • Requirements:

    • Python >= 3.4
    • Django >= 2.0
  • Install the package: uv add django-despacer (or for old-schoolers pip install django-despacer)

  • Configure Django settings to use the template loader provided

TEMPLATES = [
  {
    # ...
    "OPTIONS": {
      # ...
      "loaders": [
        (
          "django.template.loaders.cached.Loader",
          [
            (
              "django_despacer.DespacingLoader",
              [
                "django.template.loaders.filesystem.Loader",
                "django.template.loaders.app_directories.Loader",
              ]
            )
          ],
        ),
      ]
    },
  },
]
  • Since you are defining "loaders" explicitly, you must specify them all, especially "django.template.loaders.cached.Loader".
  • Apologies for the ugly configuration. If Django adopts this feature into core, you'll just need to remove the loader.

License

This project is licensed under the MIT License.

Download files

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

Source Distribution

django_despacer-0.1.2.tar.gz (4.3 kB view details)

Uploaded Source

Built Distribution

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

django_despacer-0.1.2-py3-none-any.whl (5.1 kB view details)

Uploaded Python 3

File details

Details for the file django_despacer-0.1.2.tar.gz.

File metadata

  • Download URL: django_despacer-0.1.2.tar.gz
  • Upload date:
  • Size: 4.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for django_despacer-0.1.2.tar.gz
Algorithm Hash digest
SHA256 38cf34060dc712a3188612734fc45d852c17bbbe07acd8d348aadc7d91ea86fb
MD5 9268979b281e6c2645cd35a734956df5
BLAKE2b-256 8dba35666bb5180ef4f108a45038a296d8cd071141291a33ce8f65098a7e426c

See more details on using hashes here.

File details

Details for the file django_despacer-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: django_despacer-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 5.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for django_despacer-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 15f3f0a2be96789677c88f726609837c6a10b1225b2b674ba175bf4a4a3f892d
MD5 a930bdd7bd00534ab2fc4a14e07e9735
BLAKE2b-256 06a1f4a2c226047548d3607b2100f1594afc5fec392289e94783d5547629cb4b

See more details on using hashes here.

Release history Release notifications | RSS feed

0.1.4

2 files

0.1.3

2 files

This release

0.1.2 This release

2 files

0.1.1

2 files

0.1.0

2 files

Supported by

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