You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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库(推荐,配置更清晰)

  1. 安装依赖:
pip install django-hosts
  1. 修改settings.py配置:
# settings.py
INSTALLED_APPS = [
    # 原有应用
    'django_hosts',  # 添加该应用
]

# 指定域名路由配置文件
ROOT_HOSTCONF = '你的项目名.hosts'
# 默认域名(根域名,对应客户门户)
DEFAULT_HOST = 'portal'
# 允许访问的域名
ALLOWED_HOSTS = ['domain.com', 'api.domain.com']
  1. 在项目根目录创建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'),
)
  1. 拆分路由文件:
    • 创建portal_urls.py,写入客户门户的所有路由规则;
    • 创建api_urls.py,写入API的所有路由规则。
  2. 调整项目根urls.py,让django-hosts接管路由逻辑:
# urls.py
# 无需再定义具体路由,交给hosts.py处理即可
urlpatterns = []

方案二:自定义中间件(无第三方依赖)

如果不想引入第三方库,可自行编写中间件根据域名切换路由:

  1. 在项目中创建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)
  1. 在settings.py中注册该中间件(注意放在CommonMiddleware之前):
# settings.py
MIDDLEWARE = [
    # 其他中间件...
    '你的项目名.middleware.DomainRouterMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 其他中间件...
]

ALLOWED_HOSTS = ['domain.com', 'api.domain.com']
  1. 同样拆分portal_urls.py和api_urls.py存放对应路由即可。

内容的提问来源于stack exchange,提问作者p.magalhaes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:17:46