如何通过修改域名前缀调用Django应用views.py的不同函数
实现方案
完全可以实现,核心逻辑是解析请求的子域名前缀,映射到views.py中对应的函数即可,操作步骤如下:
1. 基础部署配置
- 首先在域名解析服务商处添加泛解析记录,将
*.content.com的A记录/CNAME指向Django应用部署的服务器IP/别名 - 配置服务器反向代理(Nginx/Apache等),将所有
*.content.com的请求都转发到Django运行的WSGI/ASGI服务,以Nginx为例,配置中server_name字段填写*.content.com即可匹配所有子域名请求 - 若需要支持HTTPS,需提前申请
*.content.com的泛域名SSL证书,避免子域名访问时报证书错误
2. Django 侧逻辑实现
你可以根据需求选择两种实现方式:
方式1:手动编写子域名路由中间件(无额外依赖)
适合子域名直接映射到单个视图函数的场景:
- 在Django项目根目录新建
middleware.py,添加如下代码:
from django.http import Http404 from . import views class SubdomainRouterMiddleware: def __init__(self, get_response): self.get_response = get_response # 子域名前缀与视图函数的映射表,可按需求扩展 self.subdomain_view_map = { "example": views.example_func, # 示例:新增其他前缀映射 "test": views.test_func } def __call__(self, request): # 从请求头读取Host字段 host = request.META.get("HTTP_HOST", "").lower() # 拆分Host获取子域名前缀 host_parts = host.split(".") # 匹配xxx.content.com格式的域名 if len(host_parts) == 3 and host_parts[1] == "content" and host_parts[2] == "com": subdomain_prefix = host_parts[0] if subdomain_prefix in self.subdomain_view_map: # 调用对应视图函数,逻辑与普通URL路由一致 return self.subdomain_view_map[subdomain_prefix](request) # 未匹配到的请求走原有Django路由逻辑,也可以直接返回404 return self.get_response(request)
- 在
settings.py的MIDDLEWARE列表中注册上述中间件,建议放在靠前的位置:
MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", # 新增子域名路由中间件,替换为你实际的项目路径 "your_project_name.middleware.SubdomainRouterMiddleware", # 其他原有中间件保持不变 ... ]
方式2:使用第三方子域名路由扩展
如果需要更复杂的规则(比如子域名下还要匹配多级URL路径),可以使用Django生态中专用于子域名路由的第三方扩展,配置逻辑与原生Django路由基本一致,可快速实现子域名到视图/urls模块的映射。
注意事项
- 建议统一维护子域名和视图的映射规则,不要散落在代码各处,方便后续迭代调整
- 需要对解析到的子域名前缀做合法性校验,避免恶意构造的Host头引发安全问题
- 本地测试时可以修改系统hosts文件,添加
127.0.0.1 example.content.com这类记录验证功能
内容的提问来源于stack exchange,提问作者viwichi
相关产品推荐
相关产品推荐

