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