|
11 | 11 | from fastapi import Response |
12 | 12 |
|
13 | 13 | from fastapi_redis_cache.client import FastApiRedisCache |
| 14 | +from fastapi_redis_cache.enums import RedisEvent |
14 | 15 | from fastapi_redis_cache.util import ( |
15 | 16 | ONE_DAY_IN_SECONDS, |
16 | 17 | ONE_HOUR_IN_SECONDS, |
@@ -69,6 +70,7 @@ async def inner_wrapper( |
69 | 70 | # if the redis client is not connected or request is not |
70 | 71 | # cacheable, no caching behavior is performed. |
71 | 72 | return await get_api_response_async(func, *args, **kwargs) |
| 73 | + |
72 | 74 | key = redis_cache.get_cache_key(tag, func, *args, **kwargs) |
73 | 75 | ttl, in_cache = redis_cache.check_cache(key) |
74 | 76 | if in_cache: |
@@ -150,29 +152,45 @@ async def inner_wrapper( |
150 | 152 | **kwargs: Any, # noqa: ANN401 |
151 | 153 | ) -> Any: # noqa: ANN401 |
152 | 154 | """Invalidate all cached responses with the same tag.""" |
153 | | - _headers = kwargs.get("request", None).headers |
| 155 | + response = kwargs.get("response", None) |
| 156 | + create_response_directly = not response |
| 157 | + |
| 158 | + if create_response_directly: |
| 159 | + response = Response() |
| 160 | + if "content-length" in response.headers: |
| 161 | + del response.headers["content-length"] |
154 | 162 |
|
155 | 163 | redis_cache = FastApiRedisCache() |
156 | 164 | orig_response = await get_api_response_async(func, *args, **kwargs) |
157 | 165 |
|
158 | | - if not redis_cache.redis or not redis_cache.connected or not tag: |
159 | | - # we only want to invalidate the cache if the redis client is |
160 | | - # connected and a tag is provided. |
161 | | - return orig_response |
162 | | - if kwargs: |
| 166 | + ignore_args = redis_cache.ignore_arg_types |
| 167 | + |
| 168 | + if all([redis_cache.redis, redis_cache.connected, tag, kwargs]): |
| 169 | + # remove any args that should not be used to generate the cache |
| 170 | + # key. |
| 171 | + filtered_kwargs = kwargs.copy() |
| 172 | + for arg in ignore_args: |
| 173 | + filtered_kwargs.pop(arg, None) |
163 | 174 | search = "".join( |
164 | | - [f"({key}={value})" for key, value in kwargs.items()] |
| 175 | + [ |
| 176 | + f"({key}={value})" |
| 177 | + for key, value in filtered_kwargs.items() |
| 178 | + ] |
165 | 179 | ) |
166 | 180 | tag_keys = redis_cache.get_tagged_keys(tag) |
167 | 181 | found_keys = [key for key in tag_keys if search.encode() in key] |
168 | 182 | for key in found_keys: |
| 183 | + redis_cache.log( |
| 184 | + RedisEvent.KEY_DELETED_FROM_CACHE, key=key.decode() |
| 185 | + ) |
169 | 186 | redis_cache.redis.delete(key) |
170 | 187 | redis_cache.redis.srem(tag, key) |
171 | | - else: |
172 | | - # will fill this later, what to do if no kwargs are provided |
173 | | - pass |
174 | 188 |
|
175 | | - return orig_response |
| 189 | + return Response( |
| 190 | + content=serialize_json(orig_response), |
| 191 | + media_type=JSON_MEDIA_TYPE, |
| 192 | + headers=response.headers, |
| 193 | + ) |
176 | 194 |
|
177 | 195 | return inner_wrapper |
178 | 196 |
|
|
0 commit comments