跳转到主要内容

Django 'cache_page' 装饰器的强化版

项目描述

版权所有 Peter Bengtsson, mail@peterbe.com, 2013-2022

许可协议:BSD

关于 django-fancy-cache

A Django cache_page 装饰器的强化版。

与原生的 django.views.decorators.cache.change_page 不同,这个装饰器允许设置一个可调用的 key_prefix。这个可调用函数接收请求作为参数,如果它返回 None,则页面不会缓存。

此外,您还可以设置另一个名为 post_process_response 的可调用函数(它接收响应和请求作为参数),可以在将其设置到缓存之前对响应进行一些额外的修改。

最后,您可以将 post_process_response_always=True 设置为真,这样即使响应来自缓存,也会始终调用 post_process_response 可调用函数。

如何使用它

在您的Django视图中

from fancy_cache import cache_page
from django.utils.decorators import method_decorator
from django.views.generic import TemplateView

@cache_page(60 * 60)
def myview(request):
    return render(request, 'page1.html')

def prefixer(request):
    if request.method != 'GET':
        return None
    if request.GET.get('no-cache'):
        return None
    return 'myprefix'

@cache_page(60 * 60, key_prefix=prefixer)
def myotherview(request):
    return render(request, 'page2.html')

def post_processor(response, request):
    response.content += '<!-- this was post processed -->'
    return response

@cache_page(
    60 * 60,
    key_prefix=prefixer,
    post_process_response=post_processor)
def yetanotherotherview(request):
    return render(request, 'page3.html')


class MyClassBasedView(TemplateView):
    template_name = 'page4.html'

    @method_decorator(cache_page(60*60))
    def get(self, request, *args, **kwargs):
        return super().get(request, *args, **kwargs)

可选用法

如果您想要,可以配置 django-fancy-cache 记录它缓存的每个URL。这可以用于诸如失效或好奇的统计检查等情况。

您可以在装饰器本身上开启此功能。例如:

from fancy_cache import cache_page

@cache_page(60 * 60, remember_all_urls=True)
def myview(request):
    return render(request, 'page1.html')

或者,更方便的是,您可以在设置中设置默认值以将其应用于所有 cache_page 装饰器的使用:

FANCY_REMEMBER_ALL_URLS = True

现在,假设您已启用此选项。现在您可以进行如下操作:

>>> from fancy_cache.memory import find_urls
>>> list(find_urls(['/some/searchpath', '/or/like/*/this.*']))
>>> # or, to get all:
>>> list(find_urls([]))

除此之外,还有一个选项,即清除(又称使无效)已记住的URL。您只需像这样简单地使用 purge=True 选项

>>> from fancy_cache.memory import find_urls
>>> list(find_urls([], purge=True))

注意:由于 find_urls() 返回一个生成器,除非您耗尽生成器,否则清除操作不会发生。例如,通过遍历它或将其转换为列表。

如果您正在使用Memcached,您必须启用检查和设置以通过启用 FANCY_USE_MEMCACHED_CHECK_AND_SET 标志和启用 cas 在您的 CACHES 设置中记住所有URL

# in settings.py

FANCY_USE_MEMCACHED_CHECK_AND_SET = True

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
        'LOCATION': '127.0.0.1:11211',
        # This OPTIONS setting enables Memcached check-and-set which is
        # required for remember_all_urls or FANCY_REMEMBER_ALL_URLS.
        'OPTIONS': {
            'behaviors': {
                'cas': True
            }
        }
    }
 }

检查所有已记录URL的第二种方法是使用 fancy-cache 管理命令。这仅适用于您已将 fancy_cache 添加到您的 INSTALLED_APPS 设置中。现在您可以这样做

$ ./manage.py fancy-cache --help
$ ./manage.py fancy-cache
$ ./manage.py fancy-cache /some/searchpath /or/like/*/this.*
$ ./manage.py fancy-cache /some/place/* --purge
$ # or to purge them all!
$ ./manage.py fancy-cache --purge

注意,它只会打印出找到的URL(如果适用,还会清除)。

检查已记录URL的第三种方法是将以下内容添加到您的根 urls.py

url(r'fancy-cache', include('fancy_cache.urls')),

现在,如果您访问 http://localhost:8000/fancy-cache,您将看到一个列出 django-fancy-cache 记录的每个URL的表格。

可选用途(对于极好奇的人)

如果您已启用 FANCY_REMEMBER_ALL_URLS,您还可以在设置中启用 FANCY_REMEMBER_STATS_ALL_URLS。这会尝试计算每个URL的缓存命中和缓存缺失次数。

这种命中和缺失的计数被配置为持续“很长时间”。可能比您缓存的视图还要长。因此,随着时间的推移,您可能会遇到多次缺失,因为您的视图缓存已过期,并且它从头开始。

您可以在使用上述部分中描述的任何方法时查看统计信息。例如,如下所示

>>> from fancy_cache.memory import find_urls
>>> found = list(find_urls([]))[0]
>>> found[0]
'/some/page.html'
>>> found[2]
{'hits': 1235, 'misses': 12}

显然,在项目中使用 FANCY_REMEMBER_ALL_URLS 和/或 FANCY_REMEMBER_STATS_ALL_URLS 会带来一些额外的性能开销,因此只有在没有更智能的使无效方法、用于调试或您真的希望使在运行网站升级或其他操作时清除所有缓存响应成为可能的情况下才使用它。

运行测试套件

最简单的方法是直接运行

$ pip install tox
$ tox

或者,如果不使用 tox 运行,您可以简单地运行

$ export PYTHONPATH=`pwd`
$ export DJANGO_SETTINGS_MODULE=fancy_tests.tests.settings
$ django-admin.py test

变更日志

1.3.1
  • 修复了一个问题,即 FANCY_COMPRESS_REMEMBERED_URLS 设置在首次实现时引发 TypeError。

1.3.0
  • 启用 FANCY_COMPRESS_REMEMBERED_URLS 设置,在 FANCY_REMEMBER_ALL_URLS 为 True 时压缩 remembered_urls 字典。

  • 错误修复:在使用Memcached时使用正确的REMEMBERED_URLS位置。

  • 添加对Python 3.11、Django 4.1 和 4.2的支持。

  • 停止支持Python < 3.8、Django < 3.2 和 Django 4.0。

1.2.1
  • 错误修复:当 FANCY_USE_MEMCACHED_CHECK_AND_SET 为 True 时,DummyCache后端之间存在冲突。

1.2.0
  • 重构 remembered_urls 缓存字典以清理过时条目。

  • 更新 FancyCacheMiddleware 以匹配最新的 Django CacheMiddleware(同时重命名为 FancyCacheMiddleware)。

  • 如果 settings.FANCY_USE_MEMCACHED_CHECK_AND_SET = True,则将 Memcached 检查和设置应用于 delete_keys 函数。

  • 停止支持Python < 3.6。

  • 添加对Python 3.10和Django 4.0的支持。

1.1.0
  • 如果您使用Memcached,则可以设置 settings.FANCY_USE_MEMCACHED_CHECK_AND_SET = True,以便使用 cache._cache.cas,这仅适用于Memcached。

1.0.0
  • 停止支持Python < 3.5和Django < 2.2.0。

0.11.0
  • 针对 parse_qs 在 Python 2 和 Python 3 之间正确解析的修复

0.10.0
  • 修复了在查询字符串中保留空字符串的问题。 #39

0.9.0
  • Django 1.10 支持

0.8.2
  • 移除了在 Python 3.5 中定义 URL 模式和测试的过时方式

0.8.1
0.8.0
  • 开始维护变更日志

项目详情


下载文件

下载适合您平台的项目文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源代码分发

django-fancy-cache-1.3.1.tar.gz (18.6 kB 查看哈希值)

上传日期 源代码

构建分发

django_fancy_cache-1.3.1-py3-none-any.whl (22.9 kB 查看哈希值)

上传日期 Python 3

由以下组织支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面