部署在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
相关产品推荐
相关产品推荐

