django 缓存 REST API 网址问题
django cache REST API Urls issue
我遵循了 中提供的解决方案,当我从我的浏览器中使用它时,它运行良好。但是,当我尝试使用 curl 访问 url 时,它不会为浏览器缓存..
让我解释一下。
If i hit a url like example.org/results?limit=7
from my chrome, it
takes 8-10 seconds
to load & successive hits takes time in
milliseconds
所以我所做的就是使用 curl
命令调用此 URL
;但它没有使用缓存数据并再次创建缓存。
所以我发现问题出在下面代码中的 arg
参数,因为它包含 WSGIRequest
object 中使用的浏览器 headers缓存密钥,因为它包含 headers 也不需要缓存。这使我的 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)
我能做的是只传递 kwargs
来创建缓存或我可以为 url 做缓存的任何其他替代方法,而不是 headers
提前感谢您的帮助。
TLDR;手动移除方法装饰器和缓存
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)
cache_page装饰器
是的,缓存页面装饰器将根据 headers 决定缓存什么。但是,只有“vary”headers 应该会产生影响。
其次,只有 GET 和 HEAD 请求被缓存(并且可缓存),所以这就是为什么在上面的代码中我们首先检查方法。
md5
您可能听说过它已过时且不安全。对于密码学来说可能如此,但它不适用于我们的情况。此处使用的哈希生成方案与 django 的 _generate_cache_key 使用的完全相同,但我们从等式中省略了 headers。
一个人得到的页面很慢
每天都会有人因为缓存过期而导致页面变慢。其他人都会得到陈旧的数据。长达 23 小时 59 分钟的数据。
考虑 运行 在后台运行此任务的后台进程或 cron,比如每 6 小时刷新一次缓存。
现在使用 memcached 可能有点困难,因为它没有提供一种简单的方法来查找具有特定模式的所有键,但是如果您使用 redis 或缓存在数据库中,它会变得容易.
我遵循了
让我解释一下。
If i hit a url like
example.org/results?limit=7
from my chrome, it takes8-10 seconds
to load & successive hits takes time inmilliseconds
所以我所做的就是使用 curl
命令调用此 URL
;但它没有使用缓存数据并再次创建缓存。
所以我发现问题出在下面代码中的 arg
参数,因为它包含 WSGIRequest
object 中使用的浏览器 headers缓存密钥,因为它包含 headers 也不需要缓存。这使我的 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)
我能做的是只传递 kwargs
来创建缓存或我可以为 url 做缓存的任何其他替代方法,而不是 headers
提前感谢您的帮助。
TLDR;手动移除方法装饰器和缓存
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)
cache_page装饰器
是的,缓存页面装饰器将根据 headers 决定缓存什么。但是,只有“vary”headers 应该会产生影响。
其次,只有 GET 和 HEAD 请求被缓存(并且可缓存),所以这就是为什么在上面的代码中我们首先检查方法。
md5
您可能听说过它已过时且不安全。对于密码学来说可能如此,但它不适用于我们的情况。此处使用的哈希生成方案与 django 的 _generate_cache_key 使用的完全相同,但我们从等式中省略了 headers。
一个人得到的页面很慢
每天都会有人因为缓存过期而导致页面变慢。其他人都会得到陈旧的数据。长达 23 小时 59 分钟的数据。
考虑 运行 在后台运行此任务的后台进程或 cron,比如每 6 小时刷新一次缓存。
现在使用 memcached 可能有点困难,因为它没有提供一种简单的方法来查找具有特定模式的所有键,但是如果您使用 redis 或缓存在数据库中,它会变得容易.