eug*_*ene 4 django django-rest-framework
使用 DRF 或普通视图,我使用这样的东西。
@method_decorator(cache_page(60))
def list(self, request, *args, **kwargs):
Run Code Online (Sandbox Code Playgroud)
缓存是如何工作的?
当用户 a 请求它时,它会缓存 60 秒。
当用户 b 请求相同的端点时,它返回缓存的响应
60 秒后,缓存过期纯粹是因为时间已经过去。(60 秒内发生了什么并不重要)
当另一个用户请求相同的端点时,60 秒的周期就开始了?
基本上,cache_page是一个装饰器,可以缓存视图的响应。所以,
当另一个用户请求相同的端点时,60 秒的周期就开始了?
是的。视图将返回任何请求的缓存响应 60 秒。
假设我们有一个类似/api/foo/
用途的视图,cache_page
并且我们向该视图发出 get 请求。在请求之前;
In [1]: cache.keys("*")
Out[1]: []
Run Code Online (Sandbox Code Playgroud)
我们没有任何缓存值。先执行get请求,然后;
In [2]: cache.keys("*")
Out[2]:
['views.decorators.cache.cache_header..883916f71c4da1b141ca1ff4dc7019a5.en.Europe/Istanbul',
'views.decorators.cache.cache_page..GET.883916f71c4da1b141ca1ff4dc7019a5.05ef8c85ad5bfa657724f2753311c056.en.Europe/Istanbul']
Run Code Online (Sandbox Code Playgroud)
我们已经缓存了响应。在第一个请求之后,所有请求将在 60 秒内得到相同的响应。
但是,我不建议使用该装饰器进行缓存。因为,即使您不使用查询参数,它也会为任何请求存储新的缓存值;/api/foo/?a=1
, /api/foo/?x=y
,/api/foo/?asdasd
In [7]: cache.keys("*")
Out[7]:
['views.decorators.cache.cache_header..883916f71c4da1b141ca1ff4dc7019a5.en.Europe/Istanbul',
'views.decorators.cache.cache_header..e9c29669e862c476759c45b12ada4cbc.en.Europe/Istanbul',
'views.decorators.cache.cache_page..GET.0ab7d958193472928e5601220fd320a2.05ef8c85ad5bfa657724f2753311c056.en.Europe/Istanbul',
'views.decorators.cache.cache_header..46a68ec3d6f1ab223d7b2dd5916f2de3.en.Europe/Istanbul',
'views.decorators.cache.cache_header..0ab7d958193472928e5601220fd320a2.en.Europe/Istanbul',
'views.decorators.cache.cache_page..GET.e9c29669e862c476759c45b12ada4cbc.05ef8c85ad5bfa657724f2753311c056.en.Europe/Istanbul',
'views.decorators.cache.cache_page..GET.46a68ec3d6f1ab223d7b2dd5916f2de3.05ef8c85ad5bfa657724f2753311c056.en.Europe/Istanbul',
'views.decorators.cache.cache_page..GET.883916f71c4da1b141ca1ff4dc7019a5.05ef8c85ad5bfa657724f2753311c056.en.Europe/Istanbul']
Run Code Online (Sandbox Code Playgroud)
因此,缓存您的方法而不是使用cache_page
. 例如;
class MyService:
def _read_from_cache(self, key):
return cache.get(key)
def _write_to_cache(self, key, value, ttl=60 * 1):
cache.set(key, value, ttl)
def my_method(self):
cache_key = "my_cache_key"
cache_value = self._read_from_cache(key=cache_key)
if cache_value:
return cache_value
context = {"hello": "world"}
self._write_to_cache(key=cache_key, value=context)
return context
Run Code Online (Sandbox Code Playgroud)
并在views.py
;
def list(self, request, *args, **kwargs):
service = MyService()
context = service.my_method()
return Response(context)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
110 次 |
最近记录: |