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

Django单项目多应用多域名配置不同SESSION_COOKIE_AGE方案咨询

老兄,这个需求我之前在做一个多租户Django项目时刚好碰到过——单项目里两个应用对应不同域名,还要设置不同的会话过期时间,其实你构思的两种方案都能落地,不过得结合你的实际场景来选:

这种方案适合域名和应用严格绑定的场景(比如aaa.com只会访问应用A,bbb.com只会访问应用B),核心思路是通过自定义中间件,根据请求域名动态调整会话过期时间。

实现步骤:

  1. 在项目根目录创建middleware.py文件,写入以下中间件代码:
from django.conf import settings

class DomainSessionAgeMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 提取请求域名(去掉端口号)
        current_domain = request.get_host().split(':')[0]
        
        # 根据域名设置会话过期时间
        if current_domain == 'aaa.com':
            request.session.set_expiry(10)
        elif current_domain == 'bbb.com':
            request.session.set_expiry(20)
        else:
            # 非目标域名使用全局默认值
            request.session.set_expiry(settings.SESSION_COOKIE_AGE)
        
        response = self.get_response(request)
        
        # 同步修改响应中Cookie的过期时间,确保前后端一致
        if 'sessionid' in response.cookies:
            if current_domain == 'aaa.com':
                response.cookies['sessionid']['max-age'] = 10
            elif current_domain == 'bbb.com':
                response.cookies['sessionid']['max-age'] = 20
            else:
                response.cookies['sessionid']['max-age'] = settings.SESSION_COOKIE_AGE
        
        return response
  1. 在项目settings.py的MIDDLEWARE列表中添加这个中间件(注意要放在django.contrib.sessions.middleware.SessionMiddleware之后):
MIDDLEWARE = [
    # 其他中间件...
    'django.contrib.sessions.middleware.SessionMiddleware',
    'your_project_name.middleware.DomainSessionAgeMiddleware',  # 新增这一行
    # 其他中间件...
]

如果你的应用是通过URL前缀区分的(比如aaa.com/app-a/对应应用A,bbb.com/app-b/对应应用B),或者同一个域名可能访问多个应用,这种按应用维度设置的方案更灵活。

实现方式一:视图装饰器

写一个通用装饰器,为应用的所有视图统一设置会话过期时间:

def set_session_age(age):
    def decorator(view_func):
        def wrapped_view(request, *args, **kwargs):
            request.session.set_expiry(age)
            response = view_func(request, *args, **kwargs)
            # 同步更新Cookie过期时间
            if 'sessionid' in response.cookies:
                response.cookies['sessionid']['max-age'] = age
            return response
        return wrapped_view
    return decorator

然后在应用A的views.py中给所有视图添加装饰器:

from .decorators import set_session_age

@set_session_age(10)
def app_a_view1(request):
    # 视图逻辑...

@set_session_age(10)
def app_a_view2(request):
    # 视图逻辑...

应用B的视图则使用@set_session_age(20)装饰。

实现方式二:应用专属中间件

如果不想给每个视图加装饰器,可以写一个只对目标应用URL生效的中间件:

class AppASessionAgeMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 判断请求路径是否属于应用A
        if request.path.startswith('/app-a/'):
            request.session.set_expiry(10)
            response = self.get_response(request)
            if 'sessionid' in response.cookies:
                response.cookies['sessionid']['max-age'] = 10
            return response
        return self.get_response(request)

同理编写AppBSessionAgeMiddleware设置20秒过期时间,然后把两个中间件都加到settings.py的MIDDLEWARE列表中。

关键注意事项

  • 不要全局设置SESSION_COOKIE_DOMAIN,否则会导致两个域名共享Cookie,完全破坏会话隔离的需求。
  • 使用request.session.set_expiry()后,一定要同步修改响应中Cookie的max-age值,否则浏览器端的Cookie过期时间和后端会话的过期时间会不一致。
  • 测试时可以通过浏览器开发者工具查看sessionid Cookie的Max-Age字段,或者写个简单视图打印request.session.get_expiry_age()来验证设置是否生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:03:21