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

在Django与DjangoCMS中使用Sites框架反转跨站点URL的方法

DjangoCMS跨站点URL反向解析实现方案

核心思路

要从站点a.example.com生成指向b.example.com的对应URL,需结合Django的Site模型、URL反向解析,以及DjangoCMS的Apphook站点绑定机制,确保能正确解析目标站点的URL路径并拼接完整域名。

方法一:自定义Python函数实现跨站反向解析

编写通用函数,直接生成目标站点的完整URL:

from django.contrib.sites.models import Site
from django.urls import reverse
from django.conf import settings

def cross_site_reverse(target_domain, url_name, kwargs=None, scheme=None):
    # 动态获取协议,默认取项目配置
    scheme = scheme or ('https' if settings.SECURE_SSL_REDIRECT else 'http')
    
    # 获取目标站点实例
    try:
        target_site = Site.objects.get(domain=target_domain)
    except Site.DoesNotExist:
        raise ValueError(f"站点 {target_domain} 未在系统中配置")
    
    # 反向解析目标站点的URL路径:指定app命名空间+站点ID
    path = reverse(
        url_name,
        kwargs=kwargs or {},
        current_app='persons',  # 对应CMSApp的命名空间
        using=str(target_site.id)  # 指定使用目标站点的URL配置
    )
    
    # 拼接完整URL
    return f"{scheme}://{target_domain}{path}"

使用示例

在a.example.com的视图或模型方法中调用:

# 生成指向b.example.com的完整URL
full_url = cross_site_reverse(
    'b.example.com',
    'persons:canonic-person',
    kwargs={"person_slug": self.slug}
)
# 返回结果:https://b.example.com/de/team/aaa/

方法二:自定义模板标签用于前端页面

如果需要在模板中生成跨站链接,可创建自定义模板标签:

# 在项目的templatetags目录下创建cross_site_tags.py
from django import template
from django.contrib.sites.models import Site
from django.urls import reverse
from django.conf import settings

register = template.Library()

@register.simple_tag
def cross_site_url(target_domain, url_name, **kwargs):
    scheme = 'https' if settings.SECURE_SSL_REDIRECT else 'http'
    try:
        target_site = Site.objects.get(domain=target_domain)
    except Site.DoesNotExist:
        return ''
    
    path = reverse(
        url_name,
        kwargs=kwargs,
        current_app='persons',
        using=str(target_site.id)
    )
    return f"{scheme}://{target_domain}{path}"

模板中使用

{% load cross_site_tags %}
<a href="{% cross_site_url 'b.example.com' 'persons:canonic-person' person_slug=object.slug %}">查看B站团队页面</a>

必要前置配置

  1. Site模型配置:确保b.example.com对应的Site对象已在数据库中创建,domain字段准确设置为b.example.com。
  2. CMSApp站点绑定:在DjangoCMS后台,将persons Apphook绑定到b.example.com站点,并在该Apphook的URLconf中,将persons:canonic-person的路径配置为de/team/<slug>/。
  3. 命名空间一致性:两个站点的URLconf中,目标URL的名称必须保持一致(均为persons:canonic-person),否则反向解析会失败。

内容的提问来源于stack exchange,提问作者mogoh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 05:42:12