Static site generation

Django Nanopages integrates with django-distill to generate a fully static HTML site from your pages.

This is perfect for blogs, documentation sites, or any content that doesn’t need dynamic server-side rendering. Your pages can still be edited locally through Django admin, but the public site is served as pre-rendered static files.

Installation

Install django-distill next to django-nanopages:

pip install django-distill

Nanopages will detect if django-distill is installed, and will automatically register urls so they’re ready to be built to static content.

With nanodjango

If you’re using nanodjango, generate your static site with nanodjango manage:

nanodjango manage website.py distill-local output/

See the :docs:howto: for a full example.

With standard Django

For a standard Django project:

python manage.py distill-local output/

Build options

The distill-local command supports several useful options. See the django-distill documentation for full details, but as a quick reference:

Collect static files automatically:

python manage.py distill-local output/ --collectstatic

Force overwrite - skip confirmation prompts when overwriting existing files:

python manage.py distill-local output/ --force

Deployment

Once you’ve generated your static site, you can deploy it anywhere that serves static files. See the django-distill documentation for full details, but as a quick reference for common deployments:

GitHub Pages

Push your generated output/ directory to a gh-pages branch:

python manage.py distill-local output/
cd output/
git init
git add .
git commit -m "Deploy static site"
git push -f origin main:gh-pages

Cloud storage

Django-distill can publish directly to cloud storage providers.

For example, to publish directly to Amazon S3, install boto3:

pip install boto3

Then configure your deployment target in settings:

# settings.py
DISTILL_PUBLISH = {
    'engine': 'django_distill.backends.amazon_s3',
    'bucket': 'your-bucket-name',
    'region': 'us-east-1',
    'access_key_id': os.environ['AWS_ACCESS_KEY_ID'],
    'secret_access_key': os.environ['AWS_SECRET_ACCESS_KEY'],
}

Then publish:

python manage.py distill-publish

This automatically syncs your static site to S3, removing old files and uploading new ones.

Google Cloud Storage and Azure use similar configuration.