1
1
from functools import wraps
2
+ from fastapi .responses import Response , JSONResponse
3
+ from fastapi .encoders import jsonable_encoder
2
4
from starlette .middleware .base import BaseHTTPMiddleware , RequestResponseEndpoint
3
5
from starlette .requests import Request
4
- from starlette .responses import Response
5
6
6
7
7
- def browser_cache (max_age : int ):
8
+ def custom_browser_cache_time (max_age : int ):
8
9
def decorator (func ):
9
10
@wraps (func )
10
- async def wrapper (request : Request , call_next : RequestResponseEndpoint ):
11
- response = await func (request , call_next )
12
- response .headers ["Cache-Control" ] = f"max-age={ max_age } "
11
+ async def wrapper (* args , ** kwargs ):
12
+ response = await func (* args , ** kwargs )
13
+ if not isinstance (response , Response ):
14
+ response = JSONResponse (jsonable_encoder (response ))
15
+ response .headers ["cache-control" ] = f"max-age={ max_age } "
13
16
return response
14
17
15
18
return wrapper
@@ -19,14 +22,9 @@ async def wrapper(request: Request, call_next: RequestResponseEndpoint):
19
22
20
23
class BrowserCacheMiddleware (BaseHTTPMiddleware ):
21
24
async def dispatch (self , request : Request , call_next : RequestResponseEndpoint ) -> Response :
22
- # response = await call_next(request)
23
- # handler = request.scope.get("endpoint")
24
- # if hasattr(handler, "Cache-Control"):
25
- # max_age = response.headers["Cache-Control"]
26
- # response.headers["Cache-Control"] = f"max-age={max_age}"
27
-
28
- # elif request.method == "GET":
29
- # response.headers["Cache-Control"] = "max-age=3600"
30
- # return response
31
25
response = await call_next (request )
26
+
27
+ if response .headers .get ("cache-control" ) is None and request .method == "GET" :
28
+ response .headers ["cache-control" ] = "max-age=3600"
29
+
32
30
return response
0 commit comments