django - Django,缓存端点是什么意思?
问题描述
使用 DRF 或普通视图,我使用这样的东西。
@method_decorator(cache_page(60))
def list(self, request, *args, **kwargs):
缓存是如何工作的?
当用户 a 请求它时,它会缓存 60 秒。
当用户 b 请求同一个端点时,它返回缓存的响应
60 秒后,缓存过期纯粹是因为时间已经过去。(这 60 秒内发生了什么并不重要)
当另一个用户请求相同的终点时,60 秒的周期开始了吗?
解决方案
基本来说,cache_page是一个可以缓存视图响应的装饰器。所以,
当另一个用户请求相同的终点时,60 秒的周期开始了吗?
是的。View 将在 60 秒内为任何请求返回缓存响应。
假设我们有一个类似/api/foo/
使用的视图,cache_page
并且我们向该视图发出 get 请求。在请求之前;
In [1]: cache.keys("*")
Out[1]: []
我们没有任何缓存值。先执行获取请求,然后执行;
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']
我们已经缓存了响应。在第一次请求之后,所有请求都会在 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']
因此,缓存您的方法而不是使用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
和在views.py
;
def list(self, request, *args, **kwargs):
service = MyService()
context = service.my_method()
return Response(context)
推荐阅读
- jenkins - Jenkins Multibranch Pipeline:如何只结帐一次?
- android - 即使任务成功完成,Android WorkManager doWork() 也会重复运行
- python-3.x - 我的多线程进程无法正常工作
- ruby-on-rails - 在 Rails 中为 Wikimedia Maps 添加电子邮件到 HTTP 用户代理
- javascript - 当我在反应 js 中运行构建文件时,UI 出现放大
- c# - webApi OAuthAuthorizationServerProvider 我该如何编写注销
- python - Python 2.7 _ 添加到字符串会删除字符串?
- ruby - 从控制台读取输入后程序不继续
- python - 'AttributeError:模块'usbiss'在创建类实例时没有属性Aclass'
- wpf - DotTrace 没有明确的大量用户代码执行时间