""" Domain-based URL Configuration Middleware This middleware detects the request domain and routes to the appropriate URLconf (URL configuration) for each site: - Dovoodi domains → config.urls_dovoodi - Imam Javad domains → config.urls_imamjavad """ from django.http.response import HttpResponseRedirectBase from django.middleware.common import CommonMiddleware from django.utils.http import escape_leading_slashes class SiteMiddleware: """ Middleware to route requests to different URL configurations based on domain. This allows each domain to have clean /admin/ URLs instead of path-based differentiation (/imam-javad/admin vs /dovoodi/admin). """ def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # Force Dovoodi URL configuration for all domains request.urlconf = 'config.urls_dovoodi' return self.get_response(request) class HttpResponsePermanentRedirect308(HttpResponseRedirectBase): """ Custom response class for HTTP 308 Permanent Redirect. This preserves the original HTTP method (e.g. POST) and payload. """ status_code = 308 class CommonMiddleware308(CommonMiddleware): """ Custom CommonMiddleware that performs trailing slash redirects using HTTP 308 instead of HTTP 301. """ response_redirect_class = HttpResponsePermanentRedirect308 def get_full_path_with_slash(self, request): """ Return the full path of the request with a trailing slash appended. Overridden to bypass the settings.DEBUG RuntimeError check. Since we are redirecting with an HTTP 308 status code, the client will preserve the HTTP method and payload, meaning redirecting POST/PUT/PATCH requests is safe. """ new_path = request.get_full_path(force_append_slash=True) return escape_leading_slashes(new_path)