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

部署在AWS上的Django项目Admin端反复出现登录跳转的会话问题求助

部署在AWS上的Django项目Admin端反复出现登录跳转的会话问题求助

我现在遇到一个离谱的会话问题,部署在AWS上的Django项目,Admin端登录后只要点任何操作就立刻跳回登录页,循环往复,就像Django的会话完全记不住我一样😭。具体场景是:

  • 先登Admin,一切正常;
  • 打开用户端首页登录,Admin被挤下线(这个是正常的,同浏览器同会话嘛);
  • 但关掉用户端标签页,重新登Admin后,就彻底卡进“登录→点操作→回登录”的死循环了,点任何链接、甚至刷新都会被踢回登录页,完全没法用。

先贴一下我的生产配置文件configure.py和密钥生成文件generate_secret_key.py,麻烦大家帮忙看看哪里出问题了:

配置文件内容

configure.py

"""This file and its contents are licensed under the Apache License 2.0. Please see the included NOTICE for copyright information and LICENSE for a copy of the license. """
import json
from core.settings.base import *  # noqa
from core.utils.secret_key import generate_secret_key_if_missing

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = generate_secret_key_if_missing(BASE_DATA_DIR)

DJANGO_DB = get_env('DJANGO_DB', DJANGO_DB_SQLITE)
DATABASES = {'default': DATABASES_ALL[DJANGO_DB]}

MIDDLEWARE.append('organizations.middleware.DummyGetSessionMiddleware')
MIDDLEWARE.append('core.middleware.UpdateLastActivityMiddleware')
# if INACTIVITY_SESSION_TIMEOUT_ENABLED:
# MIDDLEWARE.append('core.middleware.InactivitySessionTimeoutMiddleWare')

ADD_DEFAULT_ML_BACKENDS = False

LOGGING['root']['level'] = get_env('LOG_LEVEL', 'WARNING')

DEBUG = get_bool_env('DEBUG', True)
DEBUG_PROPAGATE_EXCEPTIONS = get_bool_env('DEBUG_PROPAGATE_EXCEPTIONS', False)

SESSION_COOKIE_SECURE = get_bool_env('SESSION_COOKIE_SECURE', False)
SESSION_ENGINE = 'django.contrib.sessions.backends.db'

RQ_QUEUES = {}

SENTRY_DSN = get_env('SENTRY_DSN', 'https://68b045ab408a4d32a910d339be8591a4@o227124.ingest.sentry.io/5820521')
SENTRY_ENVIRONMENT = get_env('SENTRY_ENVIRONMENT', 'opensource')

FRONTEND_SENTRY_DSN = get_env(
    'FRONTEND_SENTRY_DSN', 'https://5f51920ff82a4675a495870244869c6b@o227124.ingest.sentry.io/5838868'
)
FRONTEND_SENTRY_ENVIRONMENT = get_env('FRONTEND_SENTRY_ENVIRONMENT', 'opensource')

EDITOR_KEYMAP = json.dumps(get_env('EDITOR_KEYMAP'))

from label_studio import __version__
from label_studio.core.utils import sentry
sentry.init_sentry(release_name='label-studio', release_version=__version__)

# we should do it after sentry init
from label_studio.core.utils.common import collect_versions
versions = collect_versions()

# in Label Studio Community version, feature flags are always ON
FEATURE_FLAGS_DEFAULT_VALUE = True
# or if file is not set, default is using offline mode
FEATURE_FLAGS_OFFLINE = get_bool_env('FEATURE_FLAGS_OFFLINE', True)
FEATURE_FLAGS_FILE = get_env('FEATURE_FLAGS_FILE', 'feature_flags.json')
FEATURE_FLAGS_FROM_FILE = True
try:
    from core.utils.io import find_node
    find_node('label_studio', FEATURE_FLAGS_FILE, 'file')
except IOError:
    FEATURE_FLAGS_FROM_FILE = False

STORAGE_PERSISTENCE = get_bool_env('STORAGE_PERSISTENCE', True)

generate_secret_key.py

import logging
import os
import sys
import environ
from django.core.management.utils import get_random_secret_key

logger = logging.getLogger(__name__)

def is_collectstatic() -> bool:
    for arg in sys.argv:
        if 'collectstatic' in arg:
            return True
    return False

def generate_secret_key_if_missing(data_dir: str) -> str:
    env_key = 'SECRET_KEY'
    env = environ.Env()
    env_filepath = os.path.join(data_dir, '.env')
    environ.Env.read_env(env_filepath)
    
    if existing_secret := env.str(env_key, ''):
        return existing_secret
    
    logger.warning(f'Warning: {env_key} not found in environment variables. Will generate a random key.')
    new_secret = get_random_secret_key()
    
    if is_collectstatic():
        logger.info(
            'Random SECRET_KEY was generated, but it is not being persisted because this is a collectstatic run'
        )
        return new_secret
    
    try:
        with open(env_filepath, 'a') as f:
            f.write(f'\n{env_key}={new_secret}\n')  # nosec
    except Exception as e:
        logger.warning(
            f'Warning: failed to write {env_key} to .env file: {e}, new key will be regenerated on every '
            f'server restart. If this key is used for signing, it will invalidate all existing sessions '
            f'or tokens. Please set {env_key} in your environment variables to avoid this warning.'
        )
    os.environ[env_key] = new_secret
    print(f""" generated new key : {existing_secret} and set it in file """)
    return new_secret

我自己初步排查的几个点,但不确定问题在哪:

  • SECRET_KEY的生成:看日志有时候会提示密钥没找到,自动生成新的,但生成后会写入.env吗?会不会每次重启服务器都生成新密钥?那样的话会话肯定会失效,但我看代码里如果不是collectstatic的话会写入.env啊...
  • 中间件问题:我加了DummyGetSessionMiddleware和UpdateLastActivityMiddleware,会不会是这些自定义中间件干扰了会话的读取或写入?
  • AWS部署的特殊点:比如负载均衡的粘性会话没开?或者HTTPS的问题?我现在SESSION_COOKIE_SECURE是False,但AWS上用的是ELB,会不会需要强制开启这个?
  • 会话存储:用的是数据库存储会话(SESSION_ENGINE = 'django.contrib.sessions.backends.db'),数据库是正常的,会话表django_session里也有记录,但为什么就是读不到对应会话?

有没有大佬遇到过类似的问题?或者能从我的配置里看出什么明显的坑?


内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 12:42:59