在django中,每个视图缓存装饰器可以取决于会话吗? (用于A / B测试)

时间:2014-12-07 21:15:30

标签: django caching

我有一个带有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个 - 这就是在视图层面解决这个问题的动机)

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