dj-multidomain
is a powerful Django middleware that enables dynamic routing of
requests to different URL configurations based on the domain of
incoming requests.
It also supports automatic redirection for specific domains and provides
options for shared common URLs.
This middleware is ideal for projects hosted across multiple domains or
with subdomain-specific functionalities.
Developed by Ferhat Mousavi. ferhat.mousavi@gmail.com
- Domain-Based URL Routing: Route requests to different URL configurations based on the domain.
- Subdomain Handling: Easily manage subdomains and inject subdomain data into requests.
- Automatic Redirects: Redirect specific domains to desired ones seamlessly.
- Shared URLs: Define common URLs accessible across all domains.
- Fallback Support: Set a default domain for unrecognized requests (DEBUG mode).
Install dj-multidomain
using pip:
pip install dj-multidomain
Ensure publicsuffix2
is also installed:
pip install publicsuffix2
In your settings.py
, add the middleware to the MIDDLEWARE
list:
MIDDLEWARE = [
...
'dj_multidomain.middleware.MultipleDomainMiddleware',
...
]
Use MULTI_DOMAIN_CONFIG
to map domains to their respective URL configuration files. Add this to settings.py
:
MULTI_DOMAIN_CONFIG = {
'example.com': 'project.urls_example_com',
'example.org': 'project.urls_example_org',
}
If you want to redirect specific domains to others, use MULTI_REDIRECT_CONFIG
:
MULTI_REDIRECT_CONFIG = {
'www.example.com': 'example.com',
'oldsite.org': 'newsite.org',
}
Define shared URLs that are accessible from any domain using COMMON_URLS
:
COMMON_URLS = 'project.urls_common'
If subdomain data needs to be injected into requests, use MULTI_SUBDOMAIN_CONFIG
to define parameter names:
MULTI_SUBDOMAIN_CONFIG = ['subdomain1', 'subdomain2']
Set a fallback URL configuration for unrecognized domains (only active in DEBUG mode):
DEFAULT_DOMAIN = 'example.com'
Below is a typical project structure for dj-multidomain
:
project/
├── project/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls_common.py
│ ├── urls_example_com.py
│ ├── urls_example_org.py
│ ├── views.py
├── manage.py
Create domain-specific URL files, e.g., urls_example_com.py
:
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'),
path('about/', views.about, name='about'),
]
Define shared URLs in urls_common.py
:
from django.urls import path
from . import views
urlpatterns = [
path('contact/', views.contact, name='contact'),
]
Subdomains will be available as attributes in the request
object. For example:
def subdomain_example(request):
subdomain1 = getattr(request, 'subdomain1', None)
return HttpResponse(f"Subdomain 1: {subdomain1}")
Here’s a complete example of settings.py
for dj-multidomain
:
MIDDLEWARE = [
...
'dj_multidomain.middleware.MultipleDomainMiddleware',
...
]
MULTI_DOMAIN_CONFIG = {
'example.com': 'project.urls_example_com',
'example.org': 'project.urls_example_org',
}
MULTI_REDIRECT_CONFIG = {
'www.example.com': 'example.com',
}
MULTI_SUBDOMAIN_CONFIG = ['subdomain1', 'subdomain2']
COMMON_URLS = 'project.urls_common'
DEFAULT_DOMAIN = 'example.com'
- Python: 3.10 and above
- Django: 4.0 and above
Explore a sample implementation:
GitHub: dj-multidomain Example
- For issues or feedback, open an issue in the GitHub repository.
- Contributions are welcome! Feel free to submit a pull request.
This project is licensed under the GNU General Public License v3 (GPLv3).