Browse Source
Add subdomain routing middleware and admin URL configuration
Add subdomain routing middleware and admin URL configuration
- Introduced SubdomainRoutingMiddleware to handle routing based on subdomains. - Added URL configuration for the admin subdomain, including Swagger/Redoc support. - Updated settings to include the new middleware for proper request handling.master
3 changed files with 0 additions and 170 deletions
@ -1,106 +0,0 @@ |
|||||
""" |
|
||||
Subdomain Routing Middleware |
|
||||
|
|
||||
Routes requests to different URL configurations based on the subdomain. |
|
||||
This allows clean separation of admin, API, and docs URLs. |
|
||||
|
|
||||
Subdomains: |
|
||||
- admin.imamjavad.nwhco.ir → config.urls_admin |
|
||||
- api.imamjavad.nwhco.ir → config.urls_api |
|
||||
- docs.imamjavad.nwhco.ir → config.urls_docs |
|
||||
- imamjavad.nwhco.ir → config.urls (main/frontend) |
|
||||
""" |
|
||||
from django.utils.deprecation import MiddlewareMixin |
|
||||
from django.conf import settings |
|
||||
|
|
||||
|
|
||||
class SubdomainRoutingMiddleware(MiddlewareMixin): |
|
||||
""" |
|
||||
Middleware that sets the ROOT_URLCONF based on the request's subdomain. |
|
||||
""" |
|
||||
|
|
||||
# Mapping of subdomain prefixes to URL configurations |
|
||||
SUBDOMAIN_URLCONFS = { |
|
||||
'admin': 'config.urls_admin', # Admin + Swagger/Redoc |
|
||||
} |
|
||||
|
|
||||
# List of main domains (without subdomain routing) |
|
||||
MAIN_DOMAINS = [ |
|
||||
'imamjavad.nwhco.ir', |
|
||||
'imamjavad.newhorizonco.uk', |
|
||||
'dovoodi.nwhco.ir', |
|
||||
'dovodi.newhorizonco.uk', |
|
||||
'localhost', |
|
||||
'127.0.0.1', |
|
||||
] |
|
||||
|
|
||||
def process_request(self, request): |
|
||||
""" |
|
||||
Determine the subdomain and set the appropriate ROOT_URLCONF. |
|
||||
""" |
|
||||
# Get host from request (handles X-Forwarded-Host for proxied requests) |
|
||||
host = request.get_host().split(':')[0].lower() |
|
||||
|
|
||||
# Check if this is a subdomain request |
|
||||
subdomain = self._extract_subdomain(host) |
|
||||
|
|
||||
if subdomain and subdomain in self.SUBDOMAIN_URLCONFS: |
|
||||
# Set the URL configuration for this subdomain |
|
||||
request.urlconf = self.SUBDOMAIN_URLCONFS[subdomain] |
|
||||
# Store subdomain info for potential use in views |
|
||||
request.subdomain = subdomain |
|
||||
else: |
|
||||
# Use default URL configuration |
|
||||
request.subdomain = None |
|
||||
|
|
||||
return None |
|
||||
|
|
||||
def _extract_subdomain(self, host): |
|
||||
""" |
|
||||
Extract the subdomain from the host. |
|
||||
|
|
||||
Examples: |
|
||||
- admin.imamjavad.nwhco.ir → 'admin' |
|
||||
- api.imamjavad.nwhco.ir → 'api' |
|
||||
- imamjavad.nwhco.ir → None |
|
||||
""" |
|
||||
# Check against main domains |
|
||||
for main_domain in self.MAIN_DOMAINS: |
|
||||
if host == main_domain: |
|
||||
return None |
|
||||
|
|
||||
# Check if host is a subdomain of a main domain |
|
||||
if host.endswith('.' + main_domain): |
|
||||
# Extract subdomain part |
|
||||
subdomain = host[:-len('.' + main_domain)] |
|
||||
# Only return first-level subdomain |
|
||||
if '.' not in subdomain: |
|
||||
return subdomain |
|
||||
|
|
||||
# Also check against ALLOWED_HOSTS for flexibility |
|
||||
for allowed_host in getattr(settings, 'ALLOWED_HOSTS', []): |
|
||||
if allowed_host.startswith('.'): |
|
||||
# Wildcard domain like .nwhco.ir |
|
||||
base_domain = allowed_host[1:] |
|
||||
if host.endswith(base_domain) and host != base_domain: |
|
||||
subdomain = host[:-len(base_domain)].rstrip('.') |
|
||||
if '.' not in subdomain: |
|
||||
return subdomain |
|
||||
|
|
||||
return None |
|
||||
|
|
||||
|
|
||||
def get_subdomain(request): |
|
||||
""" |
|
||||
Utility function to get the current subdomain from request. |
|
||||
Can be used in views or templates. |
|
||||
""" |
|
||||
return getattr(request, 'subdomain', None) |
|
||||
|
|
||||
|
|
||||
def is_admin_subdomain(request): |
|
||||
"""Check if current request is on admin subdomain.""" |
|
||||
return get_subdomain(request) == 'admin' |
|
||||
|
|
||||
|
|
||||
|
|
||||
@ -1,62 +0,0 @@ |
|||||
""" |
|
||||
URL configuration for Admin Subdomain (admin.imamjavad.nwhco.ir) |
|
||||
|
|
||||
This handles all admin-related URLs and Swagger/Redoc when accessed via the admin subdomain. |
|
||||
""" |
|
||||
from django.urls import path, include, re_path |
|
||||
from django.conf import settings |
|
||||
from django.conf.urls.static import static |
|
||||
from django.conf.urls.i18n import i18n_patterns |
|
||||
|
|
||||
from drf_yasg.views import get_schema_view |
|
||||
from drf_yasg import openapi |
|
||||
|
|
||||
from utils.admin import project_admin_site, dovoodi_admin_site, HomeView |
|
||||
from apps.api.views import CustomAPIDocumentationView, CustomSwaggerView, SwaggerTokenAuthView, clear_swagger_auth |
|
||||
from apps.api.permissions import IsAdminOrSwaggerToken |
|
||||
from apps.api.decorators import swagger_auth_required |
|
||||
|
|
||||
# Schema view for documentation |
|
||||
schema_view = get_schema_view( |
|
||||
openapi.Info( |
|
||||
title="Imam Javad API", |
|
||||
default_version='v1', |
|
||||
description="Comprehensive API documentation for the Imam Javad educational platform", |
|
||||
contact=openapi.Contact(email="contact@imamjavad.com"), |
|
||||
license=openapi.License(name="MIT License"), |
|
||||
), |
|
||||
public=False, |
|
||||
permission_classes=(IsAdminOrSwaggerToken,), |
|
||||
) |
|
||||
|
|
||||
# Swagger URL patterns |
|
||||
swagger_urlpatterns = [ |
|
||||
path('swagger-auth/', SwaggerTokenAuthView.as_view(), name='swagger-token-auth'), |
|
||||
path('swagger-auth/clear/', clear_swagger_auth, name='clear-swagger-auth'), |
|
||||
re_path(r'^swagger(?P<format>\.json|\.yaml)$', |
|
||||
swagger_auth_required(schema_view.without_ui(cache_timeout=0)), |
|
||||
name='schema-json'), |
|
||||
path('swagger/', CustomSwaggerView.as_view(), name='schema-swagger-ui'), |
|
||||
re_path(r'^redoc/$', |
|
||||
swagger_auth_required(schema_view.with_ui('redoc', cache_timeout=0)), |
|
||||
name='schema-redoc'), |
|
||||
] |
|
||||
|
|
||||
urlpatterns = [ |
|
||||
# Root redirect to admin |
|
||||
path("", HomeView.as_view(), name="home"), |
|
||||
path("i18n/", include("django.conf.urls.i18n")), |
|
||||
path('filer/', include('filer.urls')), |
|
||||
] |
|
||||
|
|
||||
# i18n admin + swagger patterns |
|
||||
urlpatterns += i18n_patterns( |
|
||||
path("imam-javad/admin/", project_admin_site.urls), |
|
||||
path("dovoodi/admin/", dovoodi_admin_site.urls), |
|
||||
path('docs/', CustomAPIDocumentationView.as_view(), name='docs-index'), |
|
||||
*swagger_urlpatterns, |
|
||||
path('filer/', include('filer.urls')), |
|
||||
) |
|
||||
|
|
||||
if settings.DEBUG: |
|
||||
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) |
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue