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.

Metadata

Release files for django-despacer 0.1.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-despacer 0.1.4
File Size Uploaded
django_despacer-0.1.4.tar.gz 4.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for django-despacer 0.1.4
File Interpreter ABI Platform
django_despacer-0.1.4-py3-none-any.whl Python 3 none any Details

Total release size: 9.5 kB

Release files / django_despacer-0.1.4.tar.gz

Download URL django_despacer-0.1.4.tar.gz
Size 4.3 kB
Tags Source
SHA-256 checksum
How to use checksums
19f47709f35703284ed7cee86f59c697f8f0732678d3dbdc7adb2e1cdb3854e7
BLAKE2b-256 checksum
How to use checksums
3bb11590347a1ce42cef3a1f3a96621834dc02b457356ad3ccbafe03e4c03e7c
Upload date
Uploaded using Trusted Publishing?
What is 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}

Release files / django_despacer-0.1.4-py3-none-any.whl

Download URL django_despacer-0.1.4-py3-none-any.whl
Size 5.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
59cad714b720ac622722cfbfdfdea1661c05ae2a91fdcf060c021f900c8d431e
BLAKE2b-256 checksum
How to use checksums
c3b5d25c169d4572ff9b73bd96f973ca5768323deacd2ce2dd97e1b4dbf17150
Upload date
Uploaded using Trusted Publishing?
What is 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}

Release history Release notifications | RSS feed

This release

0.1.4 This release

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page