Django API与客户门户部署:多应用合理性及CNAME路由配置咨询
问题解答
1. API与客户门户分拆为独立应用是否属于最佳实践?
这个没有绝对标准答案,需结合业务场景判断:
- 适合拆分的场景:
- API和门户业务逻辑差异大,后续会独立迭代(比如API需频繁调整接口逻辑,门户侧重UI交互优化);
- 团队按业务线分工,有专门的API开发组和前端门户组;
- 需要独立部署、扩容,比如API的QPS远高于门户,单独扩容更高效;
- 想给API和门户用不同技术栈(比如门户用Django模板+Vue,API专注RESTful设计)。
这种情况下拆分独立应用是合理选择,能降低耦合度,提升维护性和扩展性。
- 不适合拆分的场景:
- 两者业务耦合度极高,比如用户体系、核心数据逻辑完全共用,拆分后会增加跨应用调用的复杂度;
- 初期业务规模小,团队人手有限,拆分反而会增加运维和开发成本。
这种情况建议先在同一个Django项目内做模块化拆分,比如把API相关代码放在api目录,门户代码放在portal目录,用不同路由文件区分,后续业务增长后再考虑拆分。
2. Django中配置api.domain.com的CNAME路由规则
Django本身没有内置多域名路由功能,以下是两种实用方案:
方案一:使用django-hosts库(推荐,配置更清晰)
- 安装依赖:
pip install django-hosts
- 修改
settings.py配置:
# settings.py INSTALLED_APPS = [ # 原有应用 'django_hosts', # 添加该应用 ] # 指定域名路由配置文件 ROOT_HOSTCONF = '你的项目名.hosts' # 默认域名(根域名,对应客户门户) DEFAULT_HOST = 'portal' # 允许访问的域名 ALLOWED_HOSTS = ['domain.com', 'api.domain.com']
- 在项目根目录创建
hosts.py,配置域名与路由的映射:
# hosts.py from django_hosts import patterns, host host_patterns = patterns('', # 根域名指向门户路由文件 host(r'domain.com', '你的项目名.portal_urls', name='portal'), # API子域名指向API路由文件 host(r'api.domain.com', '你的项目名.api_urls', name='api'), )
- 拆分路由文件:
- 创建
portal_urls.py,写入客户门户的所有路由规则; - 创建
api_urls.py,写入API的所有路由规则。
- 创建
- 调整项目根
urls.py,让django-hosts接管路由逻辑:
# urls.py # 无需再定义具体路由,交给hosts.py处理即可 urlpatterns = []
方案二:自定义中间件(无第三方依赖)
如果不想引入第三方库,可自行编写中间件根据域名切换路由:
- 在项目中创建
middleware.py文件:
# middleware.py from django.http import Http404 from django.urls import set_urlconf class DomainRouterMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): host = request.get_host() # 根据域名设置对应的路由配置 if host == 'api.domain.com': request.urlconf = '你的项目名.api_urls' elif host == 'domain.com': request.urlconf = '你的项目名.portal_urls' else: raise Http404("无效域名") return self.get_response(request)
- 在
settings.py中注册该中间件(注意放在CommonMiddleware之前):
# settings.py MIDDLEWARE = [ # 其他中间件... '你的项目名.middleware.DomainRouterMiddleware', 'django.middleware.common.CommonMiddleware', # 其他中间件... ] ALLOWED_HOSTS = ['domain.com', 'api.domain.com']
- 同样拆分
portal_urls.py和api_urls.py存放对应路由即可。
内容的提问来源于stack exchange,提问作者p.magalhaes
相关产品推荐
相关产品推荐

