我有一个带有process_request的中间件,它决定应该为A / B测试页面计算哪个视图版本:
request.session[test] = bool(getrandbits(1))
(随机选择True / False)
我希望能够缓存两个版本的视图,具体取决于request.session [test]会话变量。
像这样的东西(它不起作用): @cache_page(60 * 15, key_prefix=request.session[test])
def view(request):
...
是否可以使缓存装饰器与会话相关?
(实际代码中的ps我在4个不同的视图中混合使用4个A / B测试,因此它实际上有16个不同的缓存键,64个版本的视图,而不仅仅是2个 - 这就是在视图层面解决这个问题的动机)
答案 0 :(得分:3)
你不能像这种情况那样使用这个装饰器,但是你可以编写自己的装饰器,它将包装这个:
from functools import wraps
from django.utils.decorators import available_attrs
def my_super_cached_page(func):
@wraps(func, assigned=available_attrs(func))
def wrapper(request, *args, **kwargs):
cached = cache_page(60 * 15, key_prefix=request.session['test'])(func)
return cached(request, *args, **kwargs)
return wrapper
我没有测试过。只是写它来向你展示这个想法。希望这会有所帮助。
答案 1 :(得分:1)
@asdasd,我用过的装饰者:
def cache_by_session_state(func):
def wrapper(request, *args, **kwargs):
cached = cache_page(60 * 60 * 4, key_prefix=session_state_cache_key)(func)
return cached(request, *args, **kwargs)
return wrapper