- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在使用(尝试)redis 作为我的 django 应用程序的缓存。这就是我正在尝试的方式。
def postview(request):
post_list = []
if cache.get("posts") == None:
post_list = Post.objects.all()
cache.set("posts", post_list, timeout=None)
else :
post_list = cache.get("posts")
context = {"post_list" : post_list}
return render(request, 'post_list.html', context)
@cache_page(60*15, key_prefix="test_cache")
def new(request):
print("testing")
return HttpResponse("hello, I am mohammed")
这是redis-cli的输出
luvpreet@DHARI-Inspiron-3542:~/test_venv_wrapper/test_redis$ redis-cli
127.0.0.1:6379> select 2 # I have redis db 2 as backend in django settings
OK
127.0.0.1:6379[2]> keys *
1) ":1:views.decorators.cache.cache_page.cache_test.GET.26488770af116d67b33750e5f304aa3e.d41d8cd98f00b204e9800998ecf8427e.en-us.UTC"
2) ":1:views.decorators.cache.cache_header..d314df08d6409ed165873dfa23271c50.en-us.UTC"
3) ":1:posts"
4) ":1:views.decorators.cache.cache_page..GET.d314df08d6409ed165873dfa23271c50.d41d8cd98f00b204e9800998ecf8427e.en-us.UTC"
5) ":1:views.decorators.cache.cache_header..26488770af116d67b33750e5f304aa3e.en-us.UTC"
6) ":1:views.decorators.cache.cache_page..GET.26488770af116d67b33750e5f304aa3e.d41d8cd98f00b204e9800998ecf8427e.en-us.UTC"
7) ":1:views.decorators.cache.cache_header.cache_test.26488770af116d67b33750e5f304aa3e.en-us.UTC"
这是其中一个键下的值,
127.0.0.1> get :1:views.decorators.cache.cache_page.cache_test.GET.26488770af116d67b33750e5f304aa3e.d41d8cd98f00b204e9800998ecf8427e.en-us.UTC
"\x80\x02cdjango.http.response\nHttpResponse\nq\x01)\x81q\x02}q\x03(U\x0e_handler_classq\x04NU\b_headersq\x05}q\x06(U\rlast-modifiedU\rLast-ModifiedU\x1dWed, 05 Apr 2017 10:56:58 GMT\x86U\aexpiresU\aExpiresU\x1dWed, 05 Apr 2017 15:06:58 GMT\x86U\x0ccontent-typeU\x0cContent-TypeU\x18text/html; charset=utf-8\x86U\rcache-controlU\rCache-ControlU\rmax-age=15000\x86uU\b_charsetq\aNU\x11_closable_objectsq\b]U\acookiesq\tcdjango.http.cookie\nSimpleCookie\nq\n)\x81q\x0b}q\x0cbU\x06closedq\r\x89U\n_containerq\x0e]q\x0fU\x14Hello, I am Mohammedq\x10aU\x0e_reason_phraseq\x11Nub."
这是一些序列化的值。
查询集 Post.objects.all()
已缓存,我可以毫无问题地从缓存中获取它。但是我无法理解这个 @cache_page()
装饰器。
为什么要在redis数据库中生成这么多key?请解释在redis数据库中制作的键。我怎样才能知道这是否有效?
最佳答案
cache_page
装饰器是一个 django 装饰器,而不是 django-redis 装饰器。所以,如果你在 django 中使用像 memcached 这样的默认缓存,那么 cache_page 装饰器就会在 memcached 中制作相同的键。这是文档字符串中的装饰器基本代码:
""" Decorator for views that tries getting the page from the cache and populates the cache if the page isn't in the cache yet. The cache is keyed by the URL and some data from the headers. Additionally there is the key prefix that is used to distinguish different cache areas in a multi-site setup. You could use the get_current_site().domain, for example, as that is unique across a Django project. Additionally, all headers from the response's Vary header will be taken into account on caching -- just like the middleware does. """
因此,本质上它会创建多个 key ,一个用于 header ,另一个用于 HTTPResponse 内容。它根据 header 和内容创建 key ,因此 header 中的任何更改都会使缓存无效(例如,在不同 header 的情况下),即即使在 url 中使用相同的参数,但请求 header 中的内容不同,您将拥有单独的缓存.不同请求 header 的示例可以是为不同的登录用户发送关于同一页面的登录信息,或者根据 header 中存在的移动/桌面用户代理信息为相同的 url 提供不同的内容。这是 cache key code在 Django 中:
def _generate_cache_key(request, method, headerlist, key_prefix):
"""Return a cache key from the headers given in the header list."""
ctx = hashlib.md5()
for header in headerlist:
value = request.META.get(header)
if value is not None:
ctx.update(force_bytes(value))
url = hashlib.md5(force_bytes(iri_to_uri(request.build_absolute_uri())))
cache_key = 'views.decorators.cache.cache_page.%s.%s.%s.%s' % (
key_prefix, method, url.hexdigest(), ctx.hexdigest())
return _i18n_cache_key_suffix(request, cache_key)
def _generate_cache_header_key(key_prefix, request):
"""Return a cache key for the header cache."""
url = hashlib.md5(force_bytes(iri_to_uri(request.build_absolute_uri())))
cache_key = 'views.decorators.cache.cache_header.%s.%s' % (
key_prefix, url.hexdigest())
return _i18n_cache_key_suffix(request, cache_key)
def get_cache_key(request, key_prefix=None, method='GET', cache=None):
"""
Return a cache key based on the request URL and query. It can be used
in the request phase because it pulls the list of headers to take into
account from the global URL registry and uses those to build a cache key
to check against.
If there isn't a headerlist stored, return None, indicating that the page
needs to be rebuilt.
"""
if key_prefix is None:
key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
cache_key = _generate_cache_header_key(key_prefix, request)
if cache is None:
cache = caches[settings.CACHE_MIDDLEWARE_ALIAS]
headerlist = cache.get(cache_key)
if headerlist is not None:
return _generate_cache_key(request, method, headerlist, key_prefix)
else:
return None
关于django - 在 django-redis-cache 中使用 @cache_page() 装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43183204/
当我像这样使用 cache_page 装饰器时,如何确认我的 Django View 已被缓存: @cache_page(60) def my_view(request): 理想情况下,我想在控制台中
我有一个数据库查询在生产环境中需要几秒钟。我还有一个返回此查询的 DRF ViewSet 操作。 我已经使用 cache_page 缓存了这个action。 @method_decorator(cac
我正在尝试使用基于类的 View (TemplateView) 执行 cache_page,但我做不到。我按照此处的说明进行操作: Django--URL Caching Failing for Cl
我需要根据时间来更新特定 View 的缓存。不仅仅是缓存页面的 60 分钟生命周期,而且它应该在具体时间(新的一小时开始时)变成新的。 最佳答案 我想出了这样的东西: import datetime
问题是:我有博客应用程序,我将帖子输出 View 缓存了 5 分钟。 @cache_page(60 * 5) def article(request, slug): ... 但是,每当向帖子添
似乎唯一可行的方法是在 urls.py 中添加装饰器,这很丑陋。 有什么方法可以在 View 中应用这个装饰器吗? class HomeView(View): @method_decorato
我有基本的休息框架设置: url(r'^items/$', ItemList.as_view(), name='item-list'), ... class ItemList(generics.Lis
我正在使用(尝试)redis 作为我的 django 应用程序的缓存。这就是我正在尝试的方式。 def postview(request): post_list = [] if cac
我是一名优秀的程序员,十分优秀!