Tri*_*ton 12 python django memcached
我最近实现了Django优秀的缓存框架.但是根据我的理解,Django不会缓存在get请求中传递参数的视图.我有一个Ajax视图,传递get参数,我想缓存X秒,这是一个简单的方法吗?
在psuedo代码中,我目前有一个URL:
http://mysites/ajaxthing/?user=foo&items=10
Run Code Online (Sandbox Code Playgroud)
我想缓存任何这个url,只要它具有相同的get参数.
我目前在我的视图中使用缓存装饰器:
myview(stuff)
myview = cache_page(myview, 60 * 3)
Run Code Online (Sandbox Code Playgroud)
我确实读过关于django的各种标题,但它有点过头了,我甚至不确定它是否是正确的解决方案
Seb*_*Seb 17
是的,不同的标头不是正确的解决方案,当你想根据客户端请求标头(如用户代理等)进行缓存时使用它.
使用低级API,它看起来像这样:
from django.core.cache import cache
def get_user(request):
user_id = request.GET.get("user_id")
user = cache.get("user_id_%s"%user_id)
if user is None:
user = User.objects.get(pk=user_id)
cache.set("user_id_%s"%user_id, user, 10*60) # 10 minutes
...
..
.
Run Code Online (Sandbox Code Playgroud)
根据我对源代码的阅读和实证测试,@cache_page装饰器本身可以正确处理GET参数(至少在 Django 2.2 中)。
深入挖掘源码:
django.views.decorators.cachedjango.utils.decorators.decorator_from_middleware_with_args()django.utils.decorators.make_middleware_decorator()middleware.process_request()“中间件”所在的位置django.middleware.cache.CacheMiddleware。django.utils.cache.get_cache_key()生成缓存密钥。django.utils.cache._generate_cache_header_key().request.build_absolute_uri()“请求”所在的位置django.http.request.HttpRequestdjango.http.request.HttpRequest.get_full_path()django.http.request.HttpRequest._get_full_path()self.META.get('QUERY_STRING', '')在它返回的字符串中。另一方面,当响应完成时,会经过类似的路径middleware.process_response(),最终调用django.utils.cache._generate_cache_header_key()以确定将响应存储在缓存中的位置。
根据经验,我可以看到对装饰视图的请求正在被缓存,并且当 GET 参数更改时响应也会更改。
是的,您可以使用django-view-cache-utils,这里是您的案例的代码:
from view_cache_utils import cache_page_with_prefix
from django.utils.hashcompat import md5_constructor
...
@cache_page_with_prefix(60*15, lambda request: md5_constructor(request.get_full_path()).hexdigest())
def my_view(request):
...
Run Code Online (Sandbox Code Playgroud)