Skip to main content

django-hostmap

Host-based URL routing and host-aware reversing for Django, with zero call-site changes.

django-hostmap routes requests to different URLconfs by host (subdomain or full domain) and makes URL reversing host-aware without changing a single call site: the stock reverse(), reverse_lazy() and {% url %} keep working everywhere, including inside third-party apps. Links within the current host stay path-relative, exactly as Django produces them; links to views on another host come back as absolute URLs. Configuration is one declarative host map in settings plus one middleware.

It is the ecosystem's replacement for django-hosts, whose parallel reverse API forces invasive changes across templates and Python code and cannot fix third-party apps that call django.urls.reverse().

Installation

pip install django-hostmap
INSTALLED_APPS = [
    # ...
    "hostmap",
]

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "hostmap.middleware.HostmapMiddleware",  # before CommonMiddleware
    "django.middleware.common.CommonMiddleware",
    # ...
]

ROOT_URLCONF remains required (Django needs it at startup) and should point at the default entry's URLconf (hostmap.W003 warns on mismatch).

The host map

HOSTMAP = {
    "www": {"subdomain": "www", "urlconf": "config.urls.www"},
    "api": {"subdomain": "api", "urlconf": "config.urls.api"},
    "apex": {"host": "example.com", "redirect_to": "www"},
}
HOSTMAP_PARENT_DOMAIN = "example.com"
HOSTMAP_DEFAULT = "www"

With www active:

Call Returns
reverse("blog:index") /blog/ (byte-identical to stock Django)
reverse("api:user-detail", args=[7]) https://api.example.com/users/7/
{% url "api:user-detail" 7 %} the absolute URL, no template changes

Same-host links stay relative; cross-host links come back absolute. Nothing at the call site changes.

Settings

Setting Default Description
HOSTMAP {} The host map. Empty map disables all behaviour
HOSTMAP_PARENT_DOMAIN "" Domain joined to subdomain entries
HOSTMAP_DEFAULT "" Entry for unmatched hosts and out-of-request reversing
HOSTMAP_PATCH_REVERSE True Make stock reverse() / {% url %} host-aware
HOSTMAP_SCHEME "https" Scheme for cross-host absolute URLs
HOSTMAP_PORT "" Port appended to all generated hosts
HOSTMAP_UNMATCHED "default" "default" routes unmatched hosts to the default entry; "reject" returns 404
HOSTMAP_REDIRECT_PERMANENT True redirect_to entries use 301, else 302

Explicit API

For code that needs an absolute URL regardless of the active host (emails, Celery tasks, API payloads, webhooks):

from hostmap.urls import reverse, build_absolute_uri, use_host

build_absolute_uri("api:user-detail", args=[7])          # always absolute
with use_host("api"):
    reverse("user-detail", args=[7])                     # api active

with use_host(host="acme.example.com"):                  # a wildcard host
    reverse("dashboard")

Development story

Modern browsers resolve *.localhost to loopback (RFC 6761), so the whole map works locally with no /etc/hosts edits:

HOSTMAP_PARENT_DOMAIN = "localhost"
HOSTMAP_SCHEME = "http"
HOSTMAP_PORT = "8000"
ALLOWED_HOSTS = [".localhost"]

Behind a proxy

Host routing is only as good as the Host header that reaches Django. Behind a reverse proxy, either the proxy passes Host through unchanged or the deployment sets USE_X_FORWARDED_HOST = True with the proxy sending X-Forwarded-Host. Misrouted hosts behind nginx are otherwise the first support issue.

Escape hatch

HOSTMAP_PATCH_REVERSE = False degrades cleanly to routing-only: the stock reverse() is left untouched (cross-host links regress to paths), routing keeps working, and the explicit API still works. Set it if a Django upgrade lands before a compatible django-hostmap release; the startup self-test and hostmap.E009/hostmap.W004 catch a Django upgrade running ahead of the package's tested ceiling before anything breaks. With the patch active (the default), an unverified Django version is hostmap.E009, an Error that fails startup, since the patch hooks a private resolver seam that has not been verified there; with the patch off, the same condition is only hostmap.W004, a Warning, since routing-only operation never touches that seam.

Diagnostics

manage.py hostmap    # print the resolved map for the current settings

Licence

MIT. See 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_hostmap-1.1.0.tar.gz (33.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_hostmap-1.1.0-py3-none-any.whl (26.4 kB view details)

Uploaded Python 3

File details

Details for the file django_hostmap-1.1.0.tar.gz.

File metadata

  • Download URL: django_hostmap-1.1.0.tar.gz
  • Upload date:
  • Size: 33.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for django_hostmap-1.1.0.tar.gz
Algorithm Hash digest
SHA256 b5c4dd787d1f8be4aa68e7eab47c1c36df345c520440620a4d7a2caca0901f0e
MD5 5f8afb170a9bae1bed29499c089a41e9
BLAKE2b-256 67ae9b94dbc294433b7cf02eced26c5559e8c1b8c66238c36f1c5cf020beeb2d

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_hostmap-1.1.0.tar.gz:

Publisher: publish.yml on icvoss/django-hostmap

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file django_hostmap-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: django_hostmap-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 26.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for django_hostmap-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 60dd437bcc07ade8bb930a2ee1c4c105f8aa6a4291552a8643abc59abae7eade
MD5 098ebd90a5016e768e2d3d20c35a43e1
BLAKE2b-256 248cf4c3a261979f63630bfe539bc1a0fdca6b2e3ea72313d24c5a75038ab7da

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_hostmap-1.1.0-py3-none-any.whl:

Publisher: publish.yml on icvoss/django-hostmap

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

1.1.0 This release

2 files

1.0.1

2 files

1.0.0

2 files

0.1.1

2 files

0.1.0

2 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