Skip to main content

Middleware based health check for Django

Project description

Django Load Balancer Health Check

Aliveness check for Django that bypasses ALLOWED_HOSTS for the purposes of load balancers

Purpose

When running on some app platforms and behind some load balancers, it is often the case that the host header is not set appropriately for health checks. When these platforms perform an HTTP health check without the proper host header an error 400 bad request will be returned by Django. This package provides a method to allow for for a simple "aliveness" health check that bypasses the ALLOWED_HOSTS protections. ALLOWED_HOSTS protection is bypassed only for the status aliveness check URL and not for any other requests.

This package is not an alternative to something like django-health-check, but is instead a better alternative than the TCP health check that is the default on many load balancers. The TCP health checks can only see if your uWSGI/Gunicorn/Uvicorn/etc server is alive, while this package ensures that requests are being properly routed to Django.

How it works

This package works by returning an HTTP response from a middleware class before Django's common middleware performs the host check and before the security middleware does HTTPS checks. The Django URL routing system is also bypassed since that happens "below" all middleware. During request processing, django-lb-health-check checks if the request is a GET request and matches settings.ALIVENESS_URL. If it is, a static plain text "200 OK" response is returned bypassing any other processing.

Usage

Install django-lb-health-check

pip install django-lb-health-check

Add lb_health_check to your middleware at the top position. It must be above django.middleware.common.CommonMiddleware and in most cases should be above django.middleware.security.SecurityMiddleware. Security middleware does things like check for HTTPS, which is often missing in health checks from load balancers. Common middleware does the checks against ALLOWED_HOSTS.

MIDDLEWARE = [
    'lb_health_check.middleware.AliveCheck', #  <- New middleware here
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Set the URL you want to use for your aliveness check. Note that a GET request to this URL will shadow any other route you have defined through the Django URL mapper. Aliveness URL can be a string for a single health check URL or a list of strings if you want the aliveness check to run from multiple URLs. The multiple URL strategy is helpful if you are changing the URL of the endpoint by allowing both the old and new URLs to be checked.

ALIVENESS_URL = "/health-check/"

Test your health check after starting your server:

curl localhost:8000/health-check/
OK

Note that the example app has lb_health_check in INSTALLED_APPS. This is only necessary for testing purposes - the app does not use any Django models, admin, views, URL routing, or the like that would require it to be listed in INSTALLED_APPS.

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-lb-health-check-1.0.1.tar.gz (5.5 kB view details)

Uploaded Source

Built Distribution

django_lb_health_check-1.0.1-py3-none-any.whl (7.1 kB view details)

Uploaded Python 3

File details

Details for the file django-lb-health-check-1.0.1.tar.gz.

File metadata

  • Download URL: django-lb-health-check-1.0.1.tar.gz
  • Upload date:
  • Size: 5.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.8 CPython/3.9.12 Linux/5.13.0-1023-azure

File hashes

Hashes for django-lb-health-check-1.0.1.tar.gz
Algorithm Hash digest
SHA256 44a93c37db22c3e27a0404c7e3881007d2b846a2f441626d22a96f28349b332e
MD5 da23bc986c9602ee26b305b349fc8833
BLAKE2b-256 cd34e2b99a5366cf1c31884c6027492877d22f68ecb0f104485d495773bd1aea

See more details on using hashes here.

File details

Details for the file django_lb_health_check-1.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for django_lb_health_check-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 6ef16e2965a302853eb644006e16e972fb6ff8399c6b468c59a534002bf533df
MD5 cba1b92c48c89fe614627ab30c9db3ba
BLAKE2b-256 36a1cfc1983843b3b73d21c32b0cf9517972ac4a8812b61d19f23272c27548bd

See more details on using hashes here.

Supported by

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