Aga*_*nga 6 django curl django-cache django-caching django-rest-framework
我已经按照Stack overflow Link中提供的解决方案进行了操作,当我在浏览器中使用它时它工作正常.但是,当我尝试用curl点击该URL时,它不会为浏览器缓存..
让我解释.
如果我
example.org/results?limit=7从我的Chrome中点击了一个url ,则需要8-10 seconds加载并且连续点击需要花费时间milliseconds
所以我所做的是URL用curl命令调用它; 但它没有使用缓存数据并再次创建缓存.
所以我发现问题在于arg下面代码中的参数,因为它包含WSGIRequest在缓存密钥中使用的对象中的浏览器头,因为它包含我不需要缓存的头文件.这无法实现curl请求自动创建缓存的目的celery task.
@method_decorator(cache_page(60 * 60 * 24))
def dispatch(self, *arg, **kwargs):
print(arg)
print(kwargs)
return super(ProfileLikeHistoryApi, self).dispatch(*arg, **kwargs)
Run Code Online (Sandbox Code Playgroud)
我能做的是只传递kwargs创建缓存或任何其他替代方案,我可以通过它来缓存网址而不是标题
我在这里先向您的帮助表示感谢.
太长了;手动删除方法装饰器和缓存
from django.core.cache import cache
from django.utils.encoding import force_bytes, force_text, iri_to_uri
import hashlib
def dispatch(self, *arg, **kwargs):
if self.request.method == 'GET' or self.request.method == 'HEAD':
key = hashlib.md5(force_bytes(iri_to_uri(self.request.build_absolute_uri()))))
data = cache.get(key)
if not data:
data = super(ProfileLikeHistoryApi, self).dispatch(*arg, **kwargs)
cache.set(key, data, 60*60*24)
return data
return super(ProfileLikeHistoryApi, self).dispatch(*arg, **kwargs)
Run Code Online (Sandbox Code Playgroud)
是的,你是对的,缓存页面装饰器将根据标头决定缓存什么。然而,只有“变化”标头才应该产生影响。
其次,只有 GET 和 HEAD 请求被缓存(并且可缓存),这就是为什么在上面的代码中我们首先检查该方法。
您可能听说过它已经过时且不安全。对于密码学来说可能是这样,但它不适用于我们的情况。这里使用的哈希生成方案与 django 的_generate_cache_key使用的完全相同,但我们从等式中省略了标头。
每天都会有人因为缓存过期而获得缓慢的页面。其他人都会得到陈旧的数据。长达 23 小时 59 分钟的数据。
考虑运行后台进程或 cron,在后台运行此任务(例如每 6 小时一次)并刷新缓存。
现在,使用 memcached 可能有点困难,因为它没有提供一种简单的方法来查找具有特定模式的所有键,但如果您使用 redis 或缓存在数据库中,它就会变得很容易。