From 2bf2d89c528a809813065f2873a347dc2a13734c Mon Sep 17 00:00:00 2001 From: okatu-loli Date: Sat, 8 Aug 2026 01:39:34 +0800 Subject: [PATCH] =?UTF-8?q?fix(storages):=20=E4=BB=A4=E7=89=8C=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E5=A4=B1=E6=95=88=E8=8C=83=E5=9B=B4=E9=99=90=E5=AE=9A?= =?UTF-8?q?=E4=B8=BA=E5=BD=93=E5=89=8D=E5=AD=98=E5=82=A8=E5=87=AD=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/cache.py | 16 +++++++++++ app/modules/filemanager/storages/alist.py | 5 +++- tests/test_alistgo_storage.py | 35 +++++++++++++++++++++-- 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/app/core/cache.py b/app/core/cache.py index e0bf7c865..2062797f6 100644 --- a/app/core/cache.py +++ b/app/core/cache.py @@ -1274,9 +1274,17 @@ def cached(region: Optional[str] = None, maxsize: Optional[int] = 1024, ttl: Opt cache_key, cached_value, cache_region ) + async def cache_delete(*args, **kwargs) -> None: + """ + 删除当前参数对应的缓存。 + """ + cache_key = __get_cache_key(args, kwargs) + await cache_backend.delete(cache_key, region=cache_region) + async_wrapper.cache_region = cache_region async_wrapper.cache_clear = cache_clear async_wrapper.cache_exists = cache_exists + async_wrapper.cache_delete = cache_delete return async_wrapper else: # 同步函数使用同步缓存后端 @@ -1317,9 +1325,17 @@ def cached(region: Optional[str] = None, maxsize: Optional[int] = 1024, ttl: Opt cache_key, cached_value, cache_region ) + def cache_delete(*args, **kwargs) -> None: + """ + 删除当前参数对应的缓存。 + """ + cache_key = __get_cache_key(args, kwargs) + cache_backend.delete(cache_key, region=cache_region) + wrapper.cache_region = cache_region wrapper.cache_clear = cache_clear wrapper.cache_exists = cache_exists + wrapper.cache_delete = cache_delete return wrapper return decorator diff --git a/app/modules/filemanager/storages/alist.py b/app/modules/filemanager/storages/alist.py index 6704d8617..458992d97 100644 --- a/app/modules/filemanager/storages/alist.py +++ b/app/modules/filemanager/storages/alist.py @@ -47,7 +47,10 @@ class Alist(StorageBase, metaclass=WeakSingleton): """ 初始化 """ - self.__login_token.cache_clear() # noqa + conf = self.get_conf() + self.__login_token.cache_delete( # noqa + self, self.__get_base_url, conf.get("username"), conf.get("password") + ) def _delay_get_item( self, path: Path, /, refresh: bool = False diff --git a/tests/test_alistgo_storage.py b/tests/test_alistgo_storage.py index e166c230b..4c025f695 100644 --- a/tests/test_alistgo_storage.py +++ b/tests/test_alistgo_storage.py @@ -19,9 +19,9 @@ class _FakeResponse: @pytest.fixture def clear_token_cache(): - Alist().init_storage() + Alist._Alist__login_token.cache_clear() # noqa yield - Alist().init_storage() + Alist._Alist__login_token.cache_clear() # noqa def test_alistgo_schema_registered(): @@ -61,3 +61,34 @@ def test_alistgo_token_isolated_from_alist(clear_token_cache): assert alistgo._Alist__generate_token() == "token-alistgo" # noqa assert request_utils.post_res.call_count == 2 + + +def test_init_storage_keeps_other_storage_token(clear_token_cache): + def _conf(storage): + return { + "url": f"http://{storage.schema.value}.test", + "username": "user", + "password": "pass", + } + + responses = [ + _FakeResponse({"code": 200, "message": "success", "data": {"token": "token-alist"}}), + _FakeResponse({"code": 200, "message": "success", "data": {"token": "token-alistgo"}}), + _FakeResponse({"code": 200, "message": "success", "data": {"token": "token-alistgo-new"}}), + ] + request_utils = MagicMock() + request_utils.post_res.side_effect = responses + + alist = Alist() + alistgo = AlistGo() + with patch.object(Alist, "get_conf", _conf): + with patch.object(alist_module, "RequestUtils", return_value=request_utils): + assert alist._Alist__generate_token() == "token-alist" # noqa + assert alistgo._Alist__generate_token() == "token-alistgo" # noqa + + alistgo.init_storage() + + assert alist._Alist__generate_token() == "token-alist" # noqa + assert alistgo._Alist__generate_token() == "token-alistgo-new" # noqa + + assert request_utils.post_res.call_count == 3