From 6d9d952079233ae95898fb392ece65d72dc66d30 Mon Sep 17 00:00:00 2001 From: Huang Junxiang Date: Mon, 31 Mar 2025 15:50:11 +0800 Subject: [PATCH] revert: Python 3.8 compatibility (#7690) * revert: Python 3.8 compatibility * update(settings.py): default value for CACHE * fix(settings.py): fetch redis cfg locations from env * update requirements * feat(gitcli::test.yml): support redis test * feat(gitcli::test.yml): support redis test * style(gitcli::test.yml): trailing blank line --- .github/workflows/test.yml | 11 +++++ requirements.txt | 1 + seahub/settings.py | 82 ++++++++++++++++++-------------------- 3 files changed, 51 insertions(+), 43 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9f77bd5e97..e1a68a933b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,6 +6,7 @@ on: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + REDIS_HOST: localhost permissions: contents: read @@ -13,6 +14,12 @@ permissions: jobs: build: runs-on: ubuntu-latest + services: + redis: + image: redis:latest + options: --health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 3 + ports: + - 6379:6379 steps: - uses: actions/checkout@v3 - uses: actions/setup-python@v4 @@ -42,6 +49,10 @@ jobs: pip install -r test-requirements.txt sudo rm -rf /usr/lib/python3/dist-packages/pytz/ + - name: Set REDIS_HOST environment variable + run: | + echo "REDIS_HOST=localhost" >> $GITHUB_ENV + - name: run pytest run: | cd $GITHUB_WORKSPACE diff --git a/requirements.txt b/requirements.txt index dcadecf414..900b91df0e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -28,3 +28,4 @@ python-ldap==3.4.* pypinyin==0.52.* dnspython==2.6.* pillow-heif==0.18.* +redis==5.0.* diff --git a/seahub/settings.py b/seahub/settings.py index 6b121f53c0..4854da4d75 100644 --- a/seahub/settings.py +++ b/seahub/settings.py @@ -538,11 +538,8 @@ central_conf_dir = os.environ.get('SEAFILE_CENTRAL_CONF_DIR', '') CACHES = { 'default': { - 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', - 'LOCATION': os.path.join(CACHE_DIR, 'seahub_cache'), - 'OPTIONS': { - 'MAX_ENTRIES': 1000000 - } + 'BACKEND': 'django.core.cache.backends.redis.RedisCache', + 'LOCATION': 'redis://redis:6379', }, } @@ -1189,53 +1186,52 @@ if 'default' in DATABASES and 'mysql' in DATABASES['default'].get('ENGINE', ''): int(DATABASES['default']['PORT']) except: raise ValueError(f"Invalid database port: {DATABASES['default']['PORT']}") - -match CACHE_PROVIDER := os.getenv('CACHE_PROVIDER', 'redis'): - case 'redis': - CACHES['default']['BACKEND'] = 'django.core.cache.backends.redis.RedisCache' - cfg_redis_host = 'redis' - cfg_redis_port = 6379 - cfg_redis_pwd = '' - if 'LOCATION' in CACHES['default']: - try: - cfg_redis_pwd, redis_host_info = CACHES['default']['LOCATION'].split('@', 1) - cfg_redis_host, cfg_redis_port = redis_host_info.split(':', 1) - except: - cfg_redis_pwd = '' - cfg_redis_host, cfg_redis_port = CACHES['default']['LOCATION'].split(':', 1) - if not cfg_redis_pwd: - try: - cfg_redis_pwd = CACHES['default']['OPTIONS']['PASSWORD'] - except: - pass - redis_host = os.environ.get('REDIS_HOST') or cfg_redis_host - redis_port = os.environ.get('REDIS_PORT') or cfg_redis_port - redis_pwd = os.environ.get('REDIS_PASSWORD') or cfg_redis_pwd - - CACHES['default']['LOCATION'] = f'redis://{(redis_pwd + "@") if redis_pwd else ""}{redis_host}:{redis_port}' - if redis_pwd: +CACHE_PROVIDER = os.getenv('CACHE_PROVIDER', 'redis') +if CACHE_PROVIDER =='redis': + CACHES['default']['BACKEND'] = 'django.core.cache.backends.redis.RedisCache' + cfg_redis_host = 'redis' + cfg_redis_port = 6379 + cfg_redis_pwd = '' + if 'LOCATION' in CACHES['default']: + cache_cfg = CACHES['default'].get('LOCATION').split('://', 1)[-1] + try: + cfg_redis_pwd, redis_host_info = cache_cfg.split('@', 1) + cfg_redis_host, cfg_redis_port = redis_host_info.split(':', 1) + except: + cfg_redis_host, cfg_redis_port = cache_cfg.split(':', 1) try: - del CACHES['default']['OPTIONS']['PASSWORD'] + cfg_redis_pwd = CACHES['default']['OPTIONS']['PASSWORD'] except: pass - case 'memcached': + redis_host = os.environ.get('REDIS_HOST') or cfg_redis_host + redis_port = os.environ.get('REDIS_PORT') or cfg_redis_port + redis_pwd = os.environ.get('REDIS_PASSWORD') or cfg_redis_pwd + + CACHES['default']['LOCATION'] = f'redis://{(redis_pwd + "@") if redis_pwd else ""}{redis_host}:{redis_port}' + if redis_pwd: try: - conf_mem_host, conf_mem_port = CACHES['default']['LOCATION'].split(':') + del CACHES['default']['OPTIONS']['PASSWORD'] except: - conf_mem_host = 'memcached' - conf_mem_port = 11211 + pass - mem_host = os.getenv('MEMCACHED_HOST') or conf_mem_host - mem_port = int(os.getenv('MEMCACHED_PORT', 0)) or conf_mem_port +elif CACHE_PROVIDER == 'memcached': + try: + conf_mem_host, conf_mem_port = CACHES['default']['LOCATION'].split(':') + except: + conf_mem_host = 'memcached' + conf_mem_port = 11211 - CACHES['default'] = { - 'BACKEND': 'django_pylibmc.memcached.PyLibMCCache', - 'LOCATION': f'{mem_host}:{mem_port}' - } - case _: - raise ValueError(f'Invalid CACHE_PROVIDER: {CACHE_PROVIDER}') + mem_host = os.getenv('MEMCACHED_HOST') or conf_mem_host + mem_port = int(os.getenv('MEMCACHED_PORT', 0)) or conf_mem_port + + CACHES['default'] = { + 'BACKEND': 'django_pylibmc.memcached.PyLibMCCache', + 'LOCATION': f'{mem_host}:{mem_port}' + } +else: + raise ValueError(f'Invalid CACHE_PROVIDER: {CACHE_PROVIDER}') if os.environ.get('ENABLE_SEADOC', ''): ENABLE_SEADOC = os.environ.get('ENABLE_SEADOC', '').lower() == 'true'